NSObject+Rx.swift 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import Foundation
  2. import RxSwift
  3. import ObjectiveC
  4. fileprivate var disposeBagContext: UInt8 = 0
  5. extension Reactive where Base: AnyObject {
  6. func synchronizedBag<T>( _ action: () -> T) -> T {
  7. objc_sync_enter(self.base)
  8. let result = action()
  9. objc_sync_exit(self.base)
  10. return result
  11. }
  12. }
  13. public extension Reactive where Base: AnyObject {
  14. /// a unique DisposeBag that is related to the Reactive.Base instance only for Reference type
  15. var disposeBag: DisposeBag {
  16. get {
  17. return synchronizedBag {
  18. if let disposeObject = objc_getAssociatedObject(base, &disposeBagContext) as? DisposeBag {
  19. return disposeObject
  20. }
  21. let disposeObject = DisposeBag()
  22. objc_setAssociatedObject(base, &disposeBagContext, disposeObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  23. return disposeObject
  24. }
  25. }
  26. set {
  27. synchronizedBag {
  28. objc_setAssociatedObject(base, &disposeBagContext, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  29. }
  30. }
  31. }
  32. }