RxSwift-disposer銷毀者

先上一段代碼

 let ob = Observable<Any>.create { (observer) -> Disposable in
            observer.onNext("hello")
            return Disposables.create {
                print("銷毀釋放了")
            }
        }
        //訂閱序列
        let dispose = ob.subscribe(onNext: { (anything) in
            print("訂閱到:\(anything)")
        }, onError: { (error) in
            print("訂閱到錯(cuò)誤:\(error)")
        }, onCompleted: {
            print("完成了")
        }) {
            print("銷毀回調(diào)")
        }
        print("執(zhí)行完畢")
        dispose.dispose()

Disposables.create 創(chuàng)建 AnonymousDisposable,記為dispose1,保存閉包

 public static func create(with dispose: @escaping () -> Void) -> Cancelable {
        return AnonymousDisposable(disposeAction: dispose)
    }

subscribe方法里面創(chuàng)建了另一個(gè)disposable,記為dispose2,
subscribe返回一個(gè)BinaryDisposable,記為bDispose,也是訂閱序列的返回值dispose,保存了2個(gè)disposable,一個(gè)是dispose2,另一個(gè)創(chuàng)建在父類Producer里,記為dispose3:SinkDisposer

//創(chuàng)建dispose3
  let disposer = SinkDisposer()
            let sinkAndSubscription = self.run(observer, cancel: disposer)
            disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)
            return disposer

self.run方法把dispose3對(duì)象傳進(jìn)去,執(zhí)行子類AnonymousObservable.run

override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {
        let sink = AnonymousObservableSink(observer: observer, cancel: cancel)
        let subscription = sink.run(self)
        return (sink: sink, subscription: subscription)
    }

sink 連接序列、觀察者和銷毀者dispose3
subscription 即為 dispose1對(duì)象

由此結(jié)論:
dispose3保存的是sinkdispose1
sink保存了觀察者和dispose3
bDispose保存了dispose2dispose3

故而:
當(dāng)手動(dòng)調(diào)用bDispose.dispose()方法時(shí):
bDispose.dispose()-->dispose2.dispose()
bDispose.dispose()-->dispose3.dispose()-->dispose1.dispose()

當(dāng)observer收到Errorcompleted事件時(shí):
ob.OnCompleted-->sink.dispose() --> dispose3.dispose()-->dispose1.dispose()
ob.OnComplete-->dispose2.dispose()

最后看一下dispose方法的實(shí)現(xiàn)

//AnonymousDisposable
  if let action = self._disposeAction {
       self._disposeAction = nil
        action()
   }
//SinkDisposer
   sink.dispose()
   subscription.dispose()
   self._sink = nil
   self._subscription = nil

忽略掉防止重復(fù)銷毀的邏輯判斷,可以看出其他disposable只是執(zhí)行了dispose的閉包回調(diào),真正銷毀的是sink,即是RxSwift 的響應(yīng)關(guān)系
補(bǔ)充一下DisposeBag:
DisposeBag實(shí)際上保存了一個(gè)Disposable集合,當(dāng)VC deinit時(shí)銷毀集合里面所有Disposable
最后補(bǔ)個(gè)圖:

銷毀流程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。