HasDisposeBag.swift 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import Foundation
  2. import RxSwift
  3. import ObjectiveC
  4. fileprivate var disposeBagContext: UInt8 = 0
  5. /// each HasDisposeBag offers a unique RxSwift DisposeBag instance
  6. public protocol HasDisposeBag: class {
  7. /// a unique RxSwift DisposeBag instance
  8. var disposeBag: DisposeBag { get set }
  9. }
  10. extension HasDisposeBag {
  11. func synchronizedBag<T>( _ action: () -> T) -> T {
  12. objc_sync_enter(self)
  13. let result = action()
  14. objc_sync_exit(self)
  15. return result
  16. }
  17. public var disposeBag: DisposeBag {
  18. get {
  19. return synchronizedBag {
  20. if let disposeObject = objc_getAssociatedObject(self, &disposeBagContext) as? DisposeBag {
  21. return disposeObject
  22. }
  23. let disposeObject = DisposeBag()
  24. objc_setAssociatedObject(self, &disposeBagContext, disposeObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  25. return disposeObject
  26. }
  27. }
  28. set {
  29. synchronizedBag {
  30. objc_setAssociatedObject(self, &disposeBagContext, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  31. }
  32. }
  33. }
  34. }