RxSwift-disposer销毁者

先上一段代码

 let ob = Observable.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: 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保存的是sinkdispose1
sink保存了观察者和dispose3
bDispose保存了dispose2dispose3

故而:
当手动调用bDispose.dispose()方法时:
bDispose.dispose()-->dispose2.dispose()
bDispose.dispose()-->dispose3.dispose()-->dispose1.dispose()

observer收到Errorcompleted事件时:
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
最后补个图:

销毁流程

你可能感兴趣的:(RxSwift-disposer销毁者)