美文网首页
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