@@ -68,10 +68,17 @@ open class ObservableThread: Thread, Observable, ObservableObject {
68
68
private var observerRemoveLock = DispatchSemaphore ( value: 1 )
69
69
70
70
public func addObserver< TObservationProtocol: AnyObject > ( _ observer: TObservationProtocol ) {
71
- let lock = observerLock. wait ( timeout: DispatchTime . now ( ) . advanced ( by: DispatchTimeInterval . milliseconds ( 10 ) ) ) == . success ? observerLock : observerAddLock
72
- var collection = ObjectIdentifier ( lock) == ObjectIdentifier ( observerLock) ? observers : observersAddQueue
73
- collection [ ObjectIdentifier ( observer) ] = ObserverContainer ( observer: observer, dispatchQueue: OperationQueue . current? . underlyingQueue)
74
- lock. signal ( )
71
+ let observation = ObserverContainer ( observer: observer, dispatchQueue: OperationQueue . current? . underlyingQueue)
72
+
73
+ if observerLock. wait ( timeout: DispatchTime . now ( ) . advanced ( by: DispatchTimeInterval . milliseconds ( 10 ) ) ) == . success {
74
+ observers [ ObjectIdentifier ( observer) ] = observation
75
+ observerLock. signal ( )
76
+ }
77
+ else {
78
+ observerAddLock. wait ( )
79
+ observersAddQueue [ ObjectIdentifier ( observer) ] = observation
80
+ observerAddLock. signal ( )
81
+ }
75
82
}
76
83
77
84
public func removeObserver< TObservationProtocol: AnyObject > ( _ observer: TObservationProtocol ) {
@@ -105,15 +112,23 @@ open class ObservableThread: Thread, Observable, ObservableObject {
105
112
}
106
113
107
114
self . observerAddLock. wait ( ) // Lock the Add Queue
115
+ let observersToAdd = self . observersAddQueue
116
+ observersAddQueue. removeAll ( )
117
+ self . observerAddLock. signal ( ) // Release the Add Queue Lock
118
+
108
119
self . observerRemoveLock. wait ( ) // Lock the Remove Queue
109
- for (id, observation) in observersAddQueue { // Add all of the Queued Observers
120
+ let observersToRemove = self . observersRemoveQueue
121
+ observersRemoveQueue. removeAll ( )
122
+ self . observerRemoveLock. signal ( ) // Release the Remove Queue Lock
123
+
124
+ // Add all of the Queued Observers
125
+ for (id, observation) in observersToAdd {
110
126
observers [ id] = observation
111
127
}
112
- for (id) in observersRemoveQueue. keys { // Remove all of the Queued Observers
128
+ // Remove all of the Queued Observers
129
+ for (id) in observersToRemove. keys {
113
130
observers. removeValue ( forKey: id)
114
131
}
115
- self . observerAddLock. signal ( ) // Release the Add Queue Lock
116
- self . observerRemoveLock. signal ( ) // Release the Remove Queue Lock
117
132
self . observerLock. signal ( )
118
133
}
119
134
0 commit comments