先上一段代碼
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
保存的是sink
和dispose1
sink
保存了觀察者和dispose3
bDispose
保存了dispose2
、dispose3
故而:
當(dāng)手動(dòng)調(diào)用bDispose.dispose()
方法時(shí):
bDispose.dispose()
-->dispose2.dispose()
bDispose.dispose()
-->dispose3.dispose()
-->dispose1.dispose()
當(dāng)observer
收到Error
、completed
事件時(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è)圖: