37 lines
1.2 KiB
Swift
37 lines
1.2 KiB
Swift
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()
|
|
}
|
|
}
|