0001 // 0002 // DisposeBag.swift 0003 // Rx 0004 // 0005 // Created by Krunoslav Zaher on 3/25/15. 0006 // Copyright © 2015 Krunoslav Zaher. All rights reserved. 0007 // 0008 0009 import Foundation 0010 0011 extension Disposable { 0012 /** 0013 Adds `self` to `bag`. 0014 0015 - parameter bag: `DisposeBag` to add `self` to. 0016 */ 0017 public func addDisposableTo(bag: DisposeBag) { 0018 bag.addDisposable(self) 0019 } 0020 } 0021 0022 /** 0023 Thread safe bag that disposes added disposables on `deinit`. 0024 0025 This returns ARC (RAII) like resource management to `RxSwift`. 0026 0027 In case contained disposables need to be disposed, just deference dispose bag 0028 or create new one in it's place. 0029 0030 self.existingDisposeBag = DisposeBag() 0031 0032 In case explicit disposal is necessary, there is also `CompositeDisposable`. 0033 */ 0034 public class DisposeBag: DisposeBase { 0035 0036 private var _lock
DisposeBag.swift:17 public func addDisposableTo(bag: DisposeBag) {= SpinLock() 0037 0038 // state 0039 private var _disposables
DisposeBag.swift:59 _lock.lock(); defer { _lock.unlock() }DisposeBag.swift:59 _lock.lock(); defer { _lock.unlock() }DisposeBag.swift:81 _lock.lock(); defer { _lock.unlock() }DisposeBag.swift:81 _lock.lock(); defer { _lock.unlock() }= [Disposable]() 0040 private var _disposed
DisposeBag.swift:64 _disposables.append(disposable)DisposeBag.swift:83 let disposables = _disposablesDisposeBag.swift:85 _disposables.removeAll(keepCapacity: false)= false 0041 0042 /** 0043 Constructs new empty dispose bag. 0044 */ 0045 public override init() { 0046 super.init() 0047 } 0048 0049 /** 0050 Adds `disposable` to be disposed when dispose bag is being deinited. 0051 0052 - parameter disposable: Disposable to add. 0053 */ 0054 public func addDisposable
DisposeBag.swift:60 if _disposed {DisposeBag.swift:86 _disposed = true(disposable: Disposable) { 0055 _addDisposable(disposable)?.dispose() 0056 } 0057 0058 private func _addDisposable
DisposeBag.swift:18 bag.addDisposable(self)(disposable: Disposable) -> Disposable? { 0059 _lock.lock(); defer { _lock.unlock() } 0060 if _disposed { 0061 return disposable 0062 } 0063 0064 _disposables.append(disposable) 0065 0066 return nil 0067 } 0068 0069 /** 0070 This is internal on purpose, take a look at `CompositeDisposable` instead. 0071 */ 0072 private func dispose
DisposeBag.swift:55 _addDisposable(disposable)?.dispose()() { 0073 let oldDisposables = _dispose() 0074 0075 for disposable in oldDisposables { 0076 disposable.dispose() 0077 } 0078 } 0079 0080 private func _dispose
DisposeBag.swift:92 dispose()() -> [Disposable] { 0081 _lock.lock(); defer { _lock.unlock() } 0082 0083 let disposables = _disposables 0084 0085 _disposables.removeAll(keepCapacity: false) 0086 _disposed = true 0087 0088 return disposables 0089 } 0090 0091 deinit { 0092 dispose() 0093 } 0094 }
DisposeBag.swift:73 let oldDisposables = _dispose()