DisposeBag
垃圾袋分析臼勉, demo
運(yùn)行如下:
self.intervalOB = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.init())
self.intervalOB.subscribe(onNext: { (num) in
self.showSencondNum.text = String(num)
}).disposed(by: disposeBag)
_ = self.stopAction.rx.tap.subscribe(onNext: {
print("點(diǎn)擊按鈕")
self.disposeBag = DisposeBag()
})
subscribe
訂閱序列的時(shí)候返回一個(gè)銷毀者DisposeBase
,當(dāng)調(diào)用.disposed(by: disposeBag)
的時(shí)候邻吭,會(huì)調(diào)用insert()
public func disposed(by bag: DisposeBag) {
bag.insert(self)
}
實(shí)際是插入到數(shù)組_disposables = [Disposable]()
中
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
當(dāng)隨著對(duì)象的生命周期結(jié)束,會(huì)調(diào)用deinit()
宴霸,內(nèi)部調(diào)用dispose()
deinit {
self.dispose()
}
緊接著會(huì)循環(huán)調(diào)用disposable.dispose()
,源碼分析如下:
private func dispose() {
let oldDisposables = self._dispose()
for disposable in oldDisposables {
disposable.dispose()
}
}
實(shí)現(xiàn)銷毀者的銷毀囱晴;