先上一段代码
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
最后补个图:
