美文网首页
RxSwift笔记(6)- Disposable销毁者

RxSwift笔记(6)- Disposable销毁者

作者: 左腿丶 | 来源:发表于2021-01-13 17:42 被阅读0次

先上一段代码


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,此时不在相互持有,不在参数循环引用,销毁了响应关系。

相关文章

网友评论

      本文标题:RxSwift笔记(6)- Disposable销毁者

      本文链接:https://www.haomeiwen.com/subject/sdguaktx.html