12345678910111213141516171819202122232425262728293031323334353637 |
- import Foundation
- import RxSwift
- import ObjectiveC
- fileprivate var disposeBagContext: UInt8 = 0
- extension Reactive where Base: AnyObject {
- func synchronizedBag<T>( _ action: () -> T) -> T {
- objc_sync_enter(self.base)
- let result = action()
- objc_sync_exit(self.base)
- return result
- }
- }
- public extension Reactive where Base: AnyObject {
- /// a unique DisposeBag that is related to the Reactive.Base instance only for Reference type
- var disposeBag: DisposeBag {
- get {
- return synchronizedBag {
- if let disposeObject = objc_getAssociatedObject(base, &disposeBagContext) as? DisposeBag {
- return disposeObject
- }
- let disposeObject = DisposeBag()
- objc_setAssociatedObject(base, &disposeBagContext, disposeObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- return disposeObject
- }
- }
-
- set {
- synchronizedBag {
- objc_setAssociatedObject(base, &disposeBagContext, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
- }
- }
|