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
DisposeBag.swift:17
    public func addDisposableTo(bag: DisposeBag) {
: DisposeBase { 0035 0036 private var _lock
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() }
= SpinLock() 0037 0038 // state 0039 private var _disposables
DisposeBag.swift:64
        _disposables.append(disposable)
DisposeBag.swift:83
        let disposables = _disposables
DisposeBag.swift:85
        _disposables.removeAll(keepCapacity: false)
= [Disposable]() 0040 private var _disposed
DisposeBag.swift:60
        if _disposed {
DisposeBag.swift:86
        _disposed = true
= 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:18
        bag.addDisposable(self)
(disposable: Disposable) { 0055 _addDisposable(disposable)?.dispose() 0056 } 0057 0058 private func _addDisposable
DisposeBag.swift:55
        _addDisposable(disposable)?.dispose()
(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:92
        dispose()
() { 0073 let oldDisposables = _dispose() 0074 0075 for disposable in oldDisposables { 0076 disposable.dispose() 0077 } 0078 } 0079 0080 private func _dispose
DisposeBag.swift:73
        let oldDisposables = _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 }