@@ -38,11 +38,19 @@ class IterableEmbeddedManager: NSObject, IterableInternalEmbeddedManagerProtocol
3838 }
3939
4040 public func getMessages( ) -> [ IterableEmbeddedMessage ] {
41- return Array ( messages. values. flatMap { $0 } )
41+ var result : [ IterableEmbeddedMessage ] = [ ]
42+ messageProcessingQueue. sync {
43+ result = Array ( messages. values. flatMap { $0 } )
44+ }
45+ return result
4246 }
4347
4448 public func getMessages( for placementId: Int ) -> [ IterableEmbeddedMessage ] {
45- return messages [ placementId] ?? [ ]
49+ var result : [ IterableEmbeddedMessage ] = [ ]
50+ messageProcessingQueue. sync {
51+ result = messages [ placementId] ?? [ ]
52+ }
53+ return result
4654 }
4755
4856 public func addUpdateListener( _ listener: IterableEmbeddedUpdateDelegate ) {
@@ -130,6 +138,7 @@ class IterableEmbeddedManager: NSObject, IterableInternalEmbeddedManagerProtocol
130138 private let urlOpener : UrlOpenerProtocol
131139 private let allowedProtocols : [ String ]
132140 private var messages : [ Int : [ IterableEmbeddedMessage ] ] = [ : ]
141+ private let messageProcessingQueue = DispatchQueue ( label: " com.iterable.embedded.messages " , qos: . userInitiated)
133142 private var listeners : NSHashTable < IterableEmbeddedUpdateDelegate > = NSHashTable ( options: [ . weakMemory] )
134143 private var trackedMessageIds : Set < String > = Set ( )
135144 private var enableEmbeddedMessaging : Bool
@@ -187,15 +196,22 @@ class IterableEmbeddedManager: NSObject, IterableInternalEmbeddedManagerProtocol
187196 }
188197
189198 private func setMessages( _ processor: EmbeddedMessagingProcessor ) {
190- messages = processor. processedMessagesList ( )
191- cleanUpTrackedMessageIds ( messages)
199+ messageProcessingQueue. sync {
200+ messages = processor. processedMessagesList ( )
201+ let currentUniqueKeys = Set ( messages. flatMap { placement, messages in
202+ messages. map { " \( placement) - \( $0. metadata. messageId) " }
203+ } )
204+ trackedMessageIds = trackedMessageIds. intersection ( currentUniqueKeys)
205+ }
192206 }
193207
194208 private func cleanUpTrackedMessageIds( _ currentMessages: [ Int : [ IterableEmbeddedMessage ] ] ) {
195209 let currentUniqueKeys = Set ( currentMessages. flatMap { placement, messages in
196210 messages. map { " \( placement) - \( $0. metadata. messageId) " }
197211 } )
198- trackedMessageIds = trackedMessageIds. intersection ( currentUniqueKeys)
212+ messageProcessingQueue. sync {
213+ trackedMessageIds = trackedMessageIds. intersection ( currentUniqueKeys)
214+ }
199215 }
200216
201217 private func trackNewlyRetrieved( _ processor: EmbeddedMessagingProcessor ) {
@@ -204,9 +220,11 @@ class IterableEmbeddedManager: NSObject, IterableInternalEmbeddedManagerProtocol
204220 let messageId = message. metadata. messageId
205221 let uniqueKey = " \( placementId) - \( messageId) "
206222
207- if !trackedMessageIds. contains ( uniqueKey) {
208- IterableAPI . track ( embeddedMessageReceived: message)
209- trackedMessageIds. insert ( uniqueKey)
223+ messageProcessingQueue. sync {
224+ if !trackedMessageIds. contains ( uniqueKey) {
225+ IterableAPI . track ( embeddedMessageReceived: message)
226+ trackedMessageIds. insert ( uniqueKey)
227+ }
210228 }
211229 }
212230 }
0 commit comments