/
HasDisposeBag.swift
53 lines (45 loc) · 1.44 KB
/
HasDisposeBag.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//
// DisposeBagable.swift
// NSObject-Rx
//
// Created by Thibault Wittemberg on 2017-08-25.
// Copyright © 2017 RxSwiftCommunity. All rights reserved.
//
import Foundation
import RxSwift
import ObjectiveC
fileprivate struct AssociatedKeys {
static var disposeBag = "disposeBag"
}
/// each DisposeBagable offers a unique Rx DisposeBag instance
public protocol HasDisposeBag {
/// a unique Rx DisposeBag instance
var disposeBag: DisposeBag { get set }
}
extension HasDisposeBag {
private func doLocked(forClosure closure: () -> Void) {
objc_sync_enter(self); defer { objc_sync_exit(self) }
closure()
}
public var disposeBag: DisposeBag {
get {
var rxDisposeBag: DisposeBag!
doLocked {
let lookup = objc_getAssociatedObject(self, &AssociatedKeys.disposeBag) as? DisposeBag
if let lookup = lookup {
rxDisposeBag = lookup
} else {
let newDisposeBag = DisposeBag()
objc_setAssociatedObject(self, &AssociatedKeys.disposeBag, newDisposeBag, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
rxDisposeBag = newDisposeBag
}
}
return rxDisposeBag
}
set {
doLocked {
objc_setAssociatedObject(self, &AssociatedKeys.disposeBag, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
}