RxSwift笔记(6)- Disposable销毁者

先上一段代码


image.png

这是笔记(1)核心逻辑中的示例代码,还记得整个流程是
Producer.subscribe->AnonymousObservable.run->AnonymousObservableSink.run->闭包A->AnyObserver.on->AnonymousObservableSink.on->Sink.forwardOn->ObserverBase.on->AnonymousObserver.onCore->闭包B
当时并没有仔细看关于Disposable,现在回过头专门去看有关于Disposable的那部分。
去看Producer.subscribe()


Producer.subscribe()

再去看AnonymousObservable.run()
AnonymousObservable.run()

这里的cancal就是Producer.subscribe()中的SinkDisposer对象,AnonymousObservableSink持有了SinkDisposer


AnonymousObservableSink父类Sink的初始化方法

在AnonymousObservable.run()返回的元祖中,sink为AnonymousObservableSink对象,subscription为闭包A中返回的Disposables.create(),subscription在这个例子中并没有什么用,所以不用管它。
点进disposer.setSinkAndSubscription()不难看出SinkDisposer同样持有AnonymousObservableSink了,这里就是为了不让释放,而是等到合适的时候才释放。另外fetchOr(self._isStopped, 1)内部进行了或运算,当error事件或者completed事件完成后,self._isStopped为1,保证了error和completed之后不再响应事件
AnonymousObservableSink.on()

那么什么时候是合适的时候呢,一种AnonymousObservableSink.on方法中event是error元素或者completed,此时SinkDisposer持有的AnonymousObservableSink会直接置为nil
Sink.dispose()

SinkDisposer.dispose()

还有一种是我们去看示例代码,主要是这一句,这句话呢是把dispos加入到disposebag中的_disposables,_disposables是一个数组
image.png

image.png

image.png

disposebag作为一个当前类的一个属性,会在当前类被销毁时调用deinit函数


image.png

保存在self._disposables中的销毁者都会调用自身的dispose()方法
在SinkDisposer.dispose(),SinkDisposer持有的AnonymousObservableSink被置为nil,此时不在相互持有,不在参数循环引用,销毁了响应关系。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容