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
}
}
}
网友评论