import Foundation import RxSwift public struct AssociatedKeys { public static var Action = "rx_action" public static var DisposeBag = "rx_disposeBag" } // Note: Actions performed in this extension are _not_ locked // So be careful! extension NSObject { // A dispose bag to be used exclusively for the instance's rx.action. public var actionDisposeBag: DisposeBag { var disposeBag: DisposeBag if let lookup = objc_getAssociatedObject(self, &AssociatedKeys.DisposeBag) as? DisposeBag { disposeBag = lookup } else { disposeBag = DisposeBag() objc_setAssociatedObject(self, &AssociatedKeys.DisposeBag, disposeBag, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } return disposeBag } // Resets the actionDisposeBag to nil, disposeing of any subscriptions within it. public func resetActionDisposeBag() { objc_setAssociatedObject(self, &AssociatedKeys.DisposeBag, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } // Uses objc_sync on self to perform a locked operation. public func doLocked(_ closure: () -> Void) { objc_sync_enter(self); defer { objc_sync_exit(self) } closure() } }