15.RxSwift 銷燬者(Dispose)

示例
// 建立序列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爲何就能夠呢,請看下面👇:bash

  1. dispose.dispose() obsubscribe的時候還作了一件事:

建立二元銷燬者:

BinaryDisposable對外提供 dispose()

那麼這裏的兩個銷燬者分別是呢: 第一個是: self.asObservable().subscribe(observer) 第二個是: subscribe時建立的 disposable 第二個來源很清楚了,直接看第一個,會來到 Producer

這個銷燬者是 SinkDisposer-> Cancelable-> Disposable,調用 run把這個 disposer傳進去了,進行記錄,在合適的地方使用,調用 dispose(),返回一個元組:

而後調用 setSinkAndSubscription保存元組的兩個值:

然而這裏的disposer:SinkDisposer返回去被咱們調用subscribe的時候接收了:disposeui

接下來 dispose直接調用 dispose(),不就會進入 SinkDisposerdispose()進行銷燬麼

最後附上整個銷燬流程圖:spa

相關文章
相關標籤/搜索