@@ -179,6 +179,7 @@ public class TritonKit {
179179 public weak var delegate : TritonKitDelegate ?
180180 public private( set) var state : ConnectionState = . disconnected {
181181 didSet {
182+ guard oldValue != state else { return }
182183 delegate? . tritonKit ( self , didChangeState: state)
183184 notifyStateObservers ( state)
184185 }
@@ -193,6 +194,7 @@ public class TritonKit {
193194 private var pingTimer : Timer ?
194195 private var defaultRequestHandler : TritonKitRequestHandler ?
195196 private var isStarted = false
197+ private let observerLock = NSLock ( )
196198 private var stateObservers : [ UUID : ( ConnectionState ) -> Void ] = [ : ]
197199 private var errorObservers : [ UUID : ( Error ) -> Void ] = [ : ]
198200 internal var endpointReadinessTimeout : TimeInterval = 0.25
@@ -256,19 +258,30 @@ public class TritonKit {
256258 @discardableResult
257259 public func onStateChange( _ handler: @escaping ( ConnectionState ) -> Void ) -> ObservationToken {
258260 let id = UUID ( )
261+ observerLock. lock ( )
259262 stateObservers [ id] = handler
260- handler ( state)
263+ let currentState = state
264+ observerLock. unlock ( )
265+ handler ( currentState)
261266 return ObservationToken { [ weak self] in
262- self ? . stateObservers. removeValue ( forKey: id)
267+ guard let self else { return }
268+ self . observerLock. lock ( )
269+ self . stateObservers. removeValue ( forKey: id)
270+ self . observerLock. unlock ( )
263271 }
264272 }
265273
266274 @discardableResult
267275 public func onError( _ handler: @escaping ( Error ) -> Void ) -> ObservationToken {
268276 let id = UUID ( )
277+ observerLock. lock ( )
269278 errorObservers [ id] = handler
279+ observerLock. unlock ( )
270280 return ObservationToken { [ weak self] in
271- self ? . errorObservers. removeValue ( forKey: id)
281+ guard let self else { return }
282+ self . observerLock. lock ( )
283+ self . errorObservers. removeValue ( forKey: id)
284+ self . observerLock. unlock ( )
272285 }
273286 }
274287
@@ -441,14 +454,20 @@ public class TritonKit {
441454 }
442455
443456 private func notifyStateObservers( _ state: ConnectionState ) {
444- for observer in Array ( stateObservers. values) {
457+ observerLock. lock ( )
458+ let observers = Array ( stateObservers. values)
459+ observerLock. unlock ( )
460+ for observer in observers {
445461 observer ( state)
446462 }
447463 }
448464
449465 private func notifyError( _ error: Error ) {
450466 delegate? . tritonKit ( self , didReceiveError: error)
451- for observer in Array ( errorObservers. values) {
467+ observerLock. lock ( )
468+ let observers = Array ( errorObservers. values)
469+ observerLock. unlock ( )
470+ for observer in observers {
452471 observer ( error)
453472 }
454473 }
0 commit comments