先上一段代码
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("订阅到错误:\(error)")
}, onCompleted: {
print("完成了")
}) {
print("销毁回调")
}
print("执行完毕")
dispose.dispose()
Disposables.create
创建 AnonymousDisposable
,记为dispose1
,保存闭包
public static func create(with dispose: @escaping () -> Void) -> Cancelable {
return AnonymousDisposable(disposeAction: dispose)
}
subscribe
方法里面创建了另一个disposable
,记为dispose2
,
subscribe
返回一个BinaryDisposable
,记为bDispose
,也是订阅序列的返回值dispose
,保存了2个disposable
,一个是dispose2
,另一个创建在父类Producer
里,记为dispose3:SinkDisposer
//创建dispose3
let disposer = SinkDisposer()
let sinkAndSubscription = self.run(observer, cancel: disposer)
disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)
return disposer
self.run
方法把dispose3
对象传进去,执行子类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
对象
由此结论:
dispose3
保存的是sink
和dispose1
sink
保存了观察者和dispose3
bDispose
保存了dispose2
、dispose3
故而:
当手动调用bDispose.dispose()
方法时:
bDispose.dispose()
-->dispose2.dispose()
bDispose.dispose()
-->dispose3.dispose()
-->dispose1.dispose()
当observer
收到Error
、completed
事件时:
ob.OnCompleted
-->sink.dispose()
--> dispose3.dispose()
-->dispose1.dispose()
ob.OnComplete
-->dispose2.dispose()
最后看一下dispose
方法的实现
//AnonymousDisposable
if let action = self._disposeAction {
self._disposeAction = nil
action()
}
//SinkDisposer
sink.dispose()
subscription.dispose()
self._sink = nil
self._subscription = nil
忽略掉防止重复销毁的逻辑判断,可以看出其他disposable只是执行了dispose的闭包回调,真正销毁的是sink
,即是RxSwift
的响应关系
补充一下DisposeBag
:
DisposeBag
实际上保存了一个Disposable
集合,当VC deinit
时销毁集合里面所有Disposable
最后补个图: