@@ -15,14 +15,12 @@ import Foundation
1515
1616class CompletionHandlersManager {
1717 private let TAG = " CompletionHandlersManager "
18- private var completionHandlers =
19- ThreadSafeDictionary < String , ( ( [ EdgeEventHandle ] ) -> Void ) > ( identifier: " com.adobe.edge.completionHandlers " )
20-
18+ private var completionHandlers = [ String : ( ( [ EdgeEventHandle ] ) -> Void ) ] ( )
2119 // edge response handles for a event request id (key)
22- private var edgeEventHandles =
23- ThreadSafeDictionary < String , [ EdgeEventHandle ] > ( identifier: " com.adobe.edge.edgeHandlesList " )
20+ private var edgeEventHandles = [ String: [ EdgeEventHandle] ] ( )
2421
2522 static let shared = CompletionHandlersManager ( )
23+ private let queue = DispatchQueue ( label: " com.adobe.edge.completionHandlersManager.queue " )
2624
2725 /// Registers a completion handler for the specified `requestEventId`. This handler is invoked when the Edge response content has been
2826 /// handled entirely by the Edge extension, containing a list of `EdgeEventHandle`(s). This list can be empty or can contain one or multiple items
@@ -38,8 +36,14 @@ class CompletionHandlersManager {
3836 return
3937 }
4038
41- Log . trace ( label: TAG, " Registering completion handler for Edge response with request event id \( forRequestEventId) . " )
42- completionHandlers [ forRequestEventId] = unwrappedCompletion
39+ queue. async { [ weak self] in
40+
41+ guard let self = self else { return }
42+
43+ Log . trace ( label: TAG, " Registering completion handler for Edge response with request event id \( forRequestEventId) . " )
44+ completionHandlers [ forRequestEventId] = unwrappedCompletion
45+ }
46+
4347 }
4448
4549 /// Calls the registered completion handler (if any) with the collected `EdgeEventHandle`(s). After this operation,
@@ -48,13 +52,20 @@ class CompletionHandlersManager {
4852 func unregisterCompletionHandler( forRequestEventId: String ) {
4953 guard !forRequestEventId. isEmpty else { return }
5054
51- if let completionHandler = completionHandlers [ forRequestEventId] {
52- completionHandler ( edgeEventHandles [ forRequestEventId] ?? [ ] )
53- _ = completionHandlers. removeValue ( forKey: forRequestEventId)
54- Log . trace ( label: TAG, " Removing completion handler for Edge response with request event id \( forRequestEventId) . " )
55+ queue. async { [ weak self] in
56+
57+ guard let self = self else { return }
58+
59+ if let completionHandler = completionHandlers [ forRequestEventId] {
60+ completionHandler ( edgeEventHandles [ forRequestEventId] ?? [ ] )
61+
62+ Log . trace ( label: TAG, " Removing completion handler for Edge response with request event id \( forRequestEventId) . " )
63+ completionHandlers. removeValue ( forKey: forRequestEventId)
64+ }
65+
66+ edgeEventHandles. removeValue ( forKey: forRequestEventId)
5567 }
5668
57- _ = edgeEventHandles. removeValue ( forKey: forRequestEventId)
5869 }
5970
6071 /// Updates the list of `EdgeEventHandle`(s) for current `requestEventId`.
@@ -63,10 +74,13 @@ class CompletionHandlersManager {
6374 /// - eventHandle: newly received event handle
6475 func eventHandleReceived( forRequestEventId: String ? , _ eventHandle: EdgeEventHandle ) {
6576 guard let unwrappedRequestEventId = forRequestEventId, !unwrappedRequestEventId. isEmpty else { return }
66- if edgeEventHandles [ unwrappedRequestEventId] != nil {
67- edgeEventHandles [ unwrappedRequestEventId] ? . append ( eventHandle)
68- } else {
69- edgeEventHandles [ unwrappedRequestEventId] = [ eventHandle]
77+
78+ queue. async { [ weak self] in
79+
80+ guard let self = self else { return }
81+
82+ edgeEventHandles [ unwrappedRequestEventId, default: [ ] ] . append ( eventHandle)
7083 }
84+
7185 }
7286}
0 commit comments