You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.1 KiB
38 lines
1.1 KiB
1 year ago
|
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)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|