Skip to content

Commit c100a02

Browse files
committed
refactor: ios- Use threadsafe mechanism to manage FlutterEventSink invocations
1 parent b5c93a0 commit c100a02

1 file changed

Lines changed: 24 additions & 13 deletions

File tree

ios/Classes/RoktEventHandler.swift

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import mParticle_Apple_SDK
1818
class RoktEventHandler: NSObject, FlutterStreamHandler {
1919

2020
private var eventListeners: [String: [FlutterEventSink]] = [:]
21+
private let eventQueue = DispatchQueue(label: "com.mparticle.rokt.event.queue")
2122
private let EVENT_CHANNEL_NAME = "MPRoktEvents"
2223

2324
init(messenger: FlutterBinaryMessenger) {
@@ -31,21 +32,25 @@ class RoktEventHandler: NSObject, FlutterStreamHandler {
3132
}
3233

3334
func onListen(withArguments arguments: Any?, eventSink: @escaping FlutterEventSink) -> FlutterError? {
34-
let key = String(describing: arguments ?? "nil")
35-
var sinks = eventListeners[key] ?? []
36-
sinks.append(eventSink)
37-
eventListeners[key] = sinks
35+
eventQueue.sync {
36+
let key = String(describing: arguments ?? "nil")
37+
var sinks = eventListeners[key] ?? []
38+
sinks.append(eventSink)
39+
eventListeners[key] = sinks
40+
}
3841
return nil
3942
}
4043

4144
func onCancel(withArguments arguments: Any?) -> FlutterError? {
42-
let key = String(describing: arguments ?? "nil")
43-
if var sinks = eventListeners[key], !sinks.isEmpty {
44-
sinks.removeLast()
45-
if sinks.isEmpty {
46-
eventListeners.removeValue(forKey: key)
47-
} else {
48-
eventListeners[key] = sinks
45+
eventQueue.sync {
46+
let key = String(describing: arguments ?? "nil")
47+
if var sinks = eventListeners[key], !sinks.isEmpty {
48+
sinks.removeLast()
49+
if sinks.isEmpty {
50+
eventListeners.removeValue(forKey: key)
51+
} else {
52+
eventListeners[key] = sinks
53+
}
4954
}
5055
}
5156
return nil
@@ -81,8 +86,14 @@ class RoktEventHandler: NSObject, FlutterStreamHandler {
8186
break
8287
}
8388

84-
self.eventListeners.values.joined().forEach { listener in
85-
listener(params)
89+
let allSinks = self.eventQueue.sync {
90+
return Array(self.eventListeners.values.joined())
91+
}
92+
93+
allSinks.forEach { listener in
94+
DispatchQueue.main.async {
95+
listener(params)
96+
}
8697
}
8798
}
8899
}

0 commit comments

Comments
 (0)