15.RxSwift 销毁者(Dispose)

示例
// 建立序列let ob = Observable<Any>.create { (observer) -> Disposable in
            observer.onNext("12345")
            return Disposables.create { print("销毁释放了")} // dispose.dispose()
        }
// 序列订阅
let dispose = ob.subscribe(onNext: { (anything) in
            print("订阅到了:\(anything)")
        }, onError: { (error) in
            print("订阅到了:\(error)")
        }, onCompleted: {
            print("完成了")
        }) {
            print("销毁回调")
        }
// 销毁关系
// status - 算法 - dispose 随时随地都能销毁
        
// 对象 是没法销毁的
        print("执行完毕")
        dispose.dispose()
复制代码

以上代码执行结果:算法

Dispose调用逻辑分析
  1. errorOrcompletedob调用subscribe的时候会建立一个观察者observer,这个时候处理errorcompleted事件的时候就会调用dispose():

可是上边的示例,并无发送errorcompleted事件,那么这个dispose()又是在哪里调用的呢? 请看咱们在调用subscribe是否是用dispose接收了,而且在下边调用了这个dispose.dispose(),但是这个dispose为何就能够呢,请看下面👇:bash

  1. dispose.dispose() obsubscribe的时候还作了一件事:

建立二元销毁者:

BinaryDisposable对外提供 dispose()

那么这里的两个销毁者分别是呢: 第一个是: self.asObservable().subscribe(observer) 第二个是: subscribe时建立的 disposable 第二个来源很清楚了,直接看第一个,会来到 Producer

这个销毁者是 SinkDisposer-> Cancelable-> Disposable,调用 run把这个 disposer传进去了,进行记录,在合适的地方使用,调用 dispose(),返回一个元组:

而后调用 setSinkAndSubscription保存元组的两个值:

然而这里的disposer:SinkDisposer返回去被咱们调用subscribe的时候接收了:disposeui

接下来 dispose直接调用 dispose(),不就会进入 SinkDisposerdispose()进行销毁么

最后附上整个销毁流程图:spa

相关文章
相关标签/搜索