15.RxSwift 销毁者(Dispose)

413 阅读1分钟
示例
// 创建序列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为什么就可以呢,请看下面👇:

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

创建二元销毁者:

BinaryDisposable对外提供dispose()

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

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

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

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

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

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