Skip to content

Commit 388ad8f

Browse files
Event managers adapted to metadata events
2 parents 2df6b41 + d865743 commit 388ad8f

File tree

7 files changed

+73
-32
lines changed

7 files changed

+73
-32
lines changed

Split/Api/DefaultSplitClient.swift

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,23 @@ extension DefaultSplitClient {
8989
on(event: event, executeTask: task)
9090
}
9191

92-
private func on(event: SplitEvent, executeTask task: SplitEventTask) {
93-
if event != .sdkReadyFromCache,
94-
eventsManager.eventAlreadyTriggered(event: event) {
95-
Logger.w("A handler was added for \(event.toString()) on the SDK, " +
96-
"which has already fired and won’t be emitted again. The callback won’t be executed.")
92+
private func onWithMetadata(event: SplitEventWithMetadata, runInBackground: Bool, queue: DispatchQueue?, execute actionWithMetadata: @escaping SplitActionWithMetadata) {
93+
guard let factory = clientManager?.splitFactory else { return }
94+
let task = SplitEventActionTask(action: actionWithMetadata, event: event.type, runInBackground: runInBackground, factory: factory, queue: queue)
95+
on(event: event.type, executeTask: task)
96+
}
97+
98+
public func on(event: SplitEvent, executeWithMetadata action: SplitActionWithMetadata?) {
99+
guard let action = action else { return }
100+
onWithMetadata(event: SplitEventWithMetadata(type: event, metadata: nil), runInBackground: true, queue: nil, execute: action)
101+
}
102+
103+
private func on(event: SplitEvent, executeTask task: SplitEventActionTask) {
104+
if event != .sdkReadyFromCache, eventsManager.eventAlreadyTriggered(event: event) {
105+
Logger.w("A handler was added for \(event.toString()) on the SDK, which has already fired and won’t be emitted again. The callback won’t be executed.")
97106
return
98107
}
99-
eventsManager.register(event: event, task: task)
108+
eventsManager.register(event: SplitEventWithMetadata(type: event, metadata: nil), task: task)
100109
}
101110
}
102111

Split/Common/Structs/BlockingQueue.swift

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,23 @@ class GenericBlockingQueue<Item> {
7373

7474
// Protocol to allow mocking
7575
protocol InternalEventBlockingQueue {
76-
func add(_ item: SplitInternalEvent)
77-
func take() throws -> SplitInternalEvent
76+
func add(_ item: SplitInternalEventWithMetadata)
77+
func take() throws -> SplitInternalEventWithMetadata
7878
func stop()
7979
}
8080

8181
class DefaultInternalEventBlockingQueue: InternalEventBlockingQueue {
82-
let blockingQueue = GenericBlockingQueue<SplitInternalEvent>()
82+
let blockingQueue = GenericBlockingQueue<SplitInternalEventWithMetadata>()
8383
func add(_ item: SplitInternalEvent) {
84+
blockingQueue.add(SplitInternalEventWithMetadata(item))
85+
}
86+
87+
func add(_ item: SplitInternalEventWithMetadata) {
8488
blockingQueue.add(item)
8589
}
8690

87-
func take() throws -> SplitInternalEvent {
88-
let value = try blockingQueue.take()
91+
func take() throws -> SplitInternalEventWithMetadata {
92+
let value = try blockingQueue.take()
8993
return value
9094
}
9195

Split/Events/EventsManagerCoordinator.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ class MainSplitEventsManager: SplitEventsManagerCoordinator {
2525
)
2626

2727
func notifyInternalEvent(_ event: SplitInternalEvent) {
28+
notifyInternalEvent(event, metadata: nil)
29+
}
30+
31+
func notifyInternalEvent(_ event: SplitInternalEvent, metadata: EventMetadata? = nil) {
2832
if !eventsToHandle.contains(event) {
2933
return
3034
}
@@ -33,7 +37,7 @@ class MainSplitEventsManager: SplitEventsManagerCoordinator {
3337

3438
self.triggered.insert(event)
3539
self.managers.forEach { _, manager in
36-
manager.notifyInternalEvent(event)
40+
manager.notifyInternalEvent(event, metadata: metadata)
3741
}
3842
}
3943
}
@@ -76,5 +80,6 @@ class MainSplitEventsManager: SplitEventsManagerCoordinator {
7680
}
7781
}
7882

79-
func register(event: SplitEvent, task: SplitEventTask) {}
83+
func register(event: SplitEvent, task: SplitEventActionTask) {}
84+
func register(event: SplitEventWithMetadata, task: SplitEventActionTask) {}
8085
}

Split/Events/SplitEventActionTask.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ class SplitEventActionTask: SplitEventTask {
4141
defer { queue = nil }
4242
return queue
4343
}
44-
45-
func run() {
46-
eventHandler?()
47-
}
4844

49-
func run(_ metadata: EventMetadata) {
50-
eventHandlerWithMetadata?(metadata)
45+
func run(_ metadata: EventMetadata?) {
46+
eventHandler?()
47+
48+
if let metadata = metadata {
49+
eventHandlerWithMetadata?(metadata)
50+
}
5151
}
5252
}

Split/Events/SplitEventTask.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,5 @@ protocol SplitEventTask {
1111
var event: SplitEvent { get }
1212
var runInBackground: Bool { get }
1313
func takeQueue() -> DispatchQueue?
14-
func run()
15-
func run(_ metadata: EventMetadata)
14+
func run(_ metadata: EventMetadata?)
1615
}

Split/Events/SplitEventsManager.swift

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import Foundation
1010

1111
protocol SplitEventsManager: AnyObject {
12-
func register(event: SplitEvent, task: SplitEventTask)
1312
func register(event: SplitEvent, task: SplitEventActionTask)
1413
func register(event: SplitEventWithMetadata, task: SplitEventActionTask)
1514
func notifyInternalEvent(_ event: SplitInternalEvent)
@@ -51,16 +50,22 @@ class DefaultSplitEventsManager: SplitEventsManager {
5150
}
5251
}
5352
}
53+
54+
func notifyInternalEvent(_ event: SplitInternalEvent, metadata: EventMetadata? = nil) {
55+
let event = SplitInternalEventWithMetadata(event, metadata: metadata)
5456

55-
func notifyInternalEvent(_ event: SplitInternalEvent) {
5657
processQueue.async { [weak self] in
5758
if let self = self {
58-
Logger.v("Event \(event) notified")
5959
self.eventsQueue.add(event)
6060
}
6161
}
6262
}
6363

64+
// Method kept for backwards compatibility. Allows notifying an event without metadata.
65+
func notifyInternalEvent(_ event: SplitInternalEvent) {
66+
notifyInternalEvent(event, metadata: nil)
67+
}
68+
6469
func register(event: SplitEventWithMetadata, task: SplitEventActionTask) {
6570
let eventName = event.type.toString()
6671
processQueue.async { [weak self] in
@@ -136,7 +141,7 @@ class DefaultSplitEventsManager: SplitEventsManager {
136141
return isRunning
137142
}
138143

139-
private func takeEvent() -> SplitInternalEvent? {
144+
private func takeEvent() -> SplitInternalEventWithMetadata? {
140145
do {
141146
return try eventsQueue.take()
142147
} catch BlockingQueueError.hasBeenStopped {
@@ -153,7 +158,7 @@ class DefaultSplitEventsManager: SplitEventsManager {
153158
return
154159
}
155160
self.triggered.append(event)
156-
switch event {
161+
switch event.type {
157162
case .splitsUpdated, .mySegmentsUpdated, .myLargeSegmentsUpdated:
158163
if isTriggered(external: .sdkReady) {
159164
trigger(event: .sdkUpdated)
@@ -209,7 +214,11 @@ class DefaultSplitEventsManager: SplitEventsManager {
209214
}
210215

211216
private func trigger(event: SplitEvent) {
212-
let eventName = event.toString()
217+
trigger(event: SplitEventWithMetadata(type: event, metadata: nil))
218+
}
219+
220+
private func trigger(event: SplitEventWithMetadata) {
221+
let eventName = event.type.toString()
213222

214223
// If executionTimes is zero, maximum executions has been reached
215224
if executionTimes(for: eventName) == 0 {
@@ -223,7 +232,7 @@ class DefaultSplitEventsManager: SplitEventsManager {
223232

224233
Logger.d("Triggering SDK event \(eventName)")
225234
// If executionTimes is lower than zero, execute it without limitation
226-
if let subscriptions = getSubscriptions(for: event) {
235+
if let subscriptions = getSubscriptions(for: event.type) {
227236
for task in subscriptions {
228237
executeTask(event: event, task: task)
229238
}
@@ -252,9 +261,13 @@ class DefaultSplitEventsManager: SplitEventsManager {
252261
}
253262
}
254263

255-
private func isTriggered(internal event: SplitInternalEvent) -> Bool {
264+
private func isTriggered(internal event: SplitInternalEventWithMetadata) -> Bool {
256265
return triggered.filter { $0 == event }.count > 0
257266
}
267+
268+
private func isTriggered(internal event: SplitInternalEvent) -> Bool {
269+
return isTriggered(internal: SplitInternalEventWithMetadata(event, metadata: nil))
270+
}
258271

259272
// MARK: Safe Data Access
260273
func executionTimes(for eventName: String) -> Int? {

SplitTests/Fake/SplitEventsManagerMock.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class SplitEventsManagerMock: SplitEventsManager {
3131
var isSdkUpdatedFired = false
3232

3333
var isSdkReadyChecked = false
34+
35+
var metadata: EventMetadata?
3436

3537
func notifyInternalEvent(_ event:SplitInternalEvent) {
3638
switch event {
@@ -52,9 +54,13 @@ class SplitEventsManagerMock: SplitEventsManager {
5254
}
5355
}
5456

55-
var registeredEvents = [SplitEvent: SplitEventTask]()
56-
func register(event: SplitEvent, task: SplitEventTask) {
57-
registeredEvents[event] = task
57+
var registeredEvents = [SplitEvent: SplitEventActionTask]()
58+
func register(event: SplitEvent, task: SplitEventActionTask) {
59+
register(event: SplitEventWithMetadata(type: event), task: task)
60+
}
61+
62+
func register(event: SplitEventWithMetadata, task: SplitEventActionTask) {
63+
registeredEvents[event.type] = task
5864
}
5965

6066
func start() {
@@ -79,4 +85,9 @@ class SplitEventsManagerMock: SplitEventsManager {
7985
return true
8086
}
8187
}
88+
89+
func notifyInternalEvent(_ event: SplitInternalEvent, metadata: EventMetadata?) {
90+
self.metadata = metadata
91+
notifyInternalEvent(event)
92+
}
8293
}

0 commit comments

Comments
 (0)