美文网首页
RxSwift-DisposeBag

RxSwift-DisposeBag

作者: Code_人生 | 来源:发表于2019-08-06 14:42 被阅读0次
        let  ob = Observable<Any>.create { (observer) -> Disposable in
            observer.onNext("dyz")
            observer.onCompleted()
            return Disposables.create {
                print("销毁释放了")
            }
        }
        
        let dispose = ob.subscribe(onNext: { (anything) in
            print("订阅到了:\(anything)")
        }, onError: { (error) in
            print("订阅到了:\(error)")
        }, onCompleted: {
            print("完成")
        }, onDisposed: {
            print("onNext 中的销毁者")
        })
        
        dispose.disposed(by: disposeBag)
订阅到了:dyz
完成
onNext 中的销毁者
销毁释放了
  • 将dispose 添加到 DisposeBag 中
  • DisposeBag会在 deinit 中自动销毁 nice
extension Disposable {
    /// Adds `self` to `bag`
    ///
    /// - parameter bag: `DisposeBag` to add `self` to.
    public func disposed(by bag: DisposeBag) {
        bag.insert(self)
    }
}
public final class DisposeBag: DisposeBase {
    
    private var _lock = SpinLock()
    
    // state
    fileprivate var _disposables = [Disposable]()
    fileprivate var _isDisposed = false
    
    /// Constructs new empty dispose bag.
    public override init() {
        super.init()
    }

    /// Adds `disposable` to be disposed when dispose bag is being deinited.
    ///
    /// - parameter disposable: Disposable to add.
    public func insert(_ disposable: Disposable) {
        self._insert(disposable)?.dispose()
    }
    
    private func _insert(_ disposable: Disposable) -> Disposable? {
        self._lock.lock(); defer { self._lock.unlock() }
        if self._isDisposed {
            return disposable
        }

        self._disposables.append(disposable)

        return nil
    }

    /// This is internal on purpose, take a look at `CompositeDisposable` instead.
    private func dispose() {
        let oldDisposables = self._dispose()

        for disposable in oldDisposables {
            disposable.dispose()
        }
    }

    private func _dispose() -> [Disposable] {
        self._lock.lock(); defer { self._lock.unlock() }

        let disposables = self._disposables
        
        self._disposables.removeAll(keepingCapacity: false)
        self._isDisposed = true
        
        return disposables
    }
    
    deinit {
        self.dispose()
    }
}
extension DisposeBag {

    /// Convenience init allows a list of disposables to be gathered for disposal.
    public convenience init(disposing disposables: Disposable...) {
        self.init()
        self._disposables += disposables
    }

    /// Convenience init allows an array of disposables to be gathered for disposal.
    public convenience init(disposing disposables: [Disposable]) {
        self.init()
        self._disposables += disposables
    }

    /// Convenience function allows a list of disposables to be gathered for disposal.
    public func insert(_ disposables: Disposable...) {
        self.insert(disposables)
    }

    /// Convenience function allows an array of disposables to be gathered for disposal.
    public func insert(_ disposables: [Disposable]) {
        self._lock.lock(); defer { self._lock.unlock() }
        if self._isDisposed {
            disposables.forEach { $0.dispose() }
        } else {
            self._disposables += disposables
        }
    }
}

相关文章

  • RxSwift-DisposeBag

    将dispose 添加到 DisposeBag 中 DisposeBag会在 deinit 中自动销毁 nice

  • RxSwift-DisposeBag垃圾袋

    DisposeBag垃圾袋分析, demo运行如下: subscribe订阅序列的时候返回一个销毁者Dispose...

网友评论

      本文标题:RxSwift-DisposeBag

      本文链接:https://www.haomeiwen.com/subject/pioidctx.html