Skip to content

Commit 2d1b317

Browse files
committed
Update Event Producer to accept multiple subscribers
1 parent f0cfe5f commit 2d1b317

File tree

4 files changed

+22
-16
lines changed

4 files changed

+22
-16
lines changed

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCommonDefines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ typedef enum {GET, POST, HEAD, PUT, DELETE, OPTIONS, CONNECT, TRACE, PATCH} HTTP
326326
#define OS_PUSH_SUBSCRIPTION_MODEL_KEY @"OS_PUSH_SUBSCRIPTION_MODEL_KEY"
327327
#define OS_PUSH_SUBSCRIPTION_MODEL_STORE_KEY @"OS_PUSH_SUBSCRIPTION_MODEL_STORE_KEY"
328328
#define OS_SUBSCRIPTION_MODEL_STORE_KEY @"OS_SUBSCRIPTION_MODEL_STORE_KEY"
329+
#define OS_MODEL_STORE_LISTENER_POSTFIX @"_LISTENER"
329330

330331
// Deltas
331332
#define OS_ADD_ALIAS_DELTA @"OS_ADD_ALIAS_DELTA"

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSEventProducer.swift

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,27 @@ import Foundation
2929
import OneSignalCore
3030

3131
public class OSEventProducer<THandler>: NSObject {
32-
// Not an array as there is at most 1 subsriber per OSEventProducer anyway
33-
var subscriber: THandler?
32+
private var subscribers: [String: THandler] = [:]
33+
private let lock = NSLock()
3434

35-
public func subscribe(_ handler: THandler) {
36-
// TODO: UM do we want to synchronize on subscribers
37-
subscriber = handler // TODO: UM style, implicit or explicit self?
35+
public func subscribe(_ handler: THandler, key: String) {
36+
lock.withLock {
37+
subscribers[key] = handler
38+
}
3839
}
3940

40-
public func unsubscribe(_ handler: THandler) {
41+
public func unsubscribe(_ handler: THandler, key: String) {
4142
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSEventProducer.unsubscribe() called with handler: \(handler)")
42-
// TODO: UM do we want to synchronize on subscribers
43-
subscriber = nil
43+
lock.withLock {
44+
subscribers.removeValue(forKey: key)
45+
}
4446
}
4547

4648
public func fire(callback: (THandler) -> Void) {
47-
// dump(subscribers) -> uncomment for more verbose log during testing
48-
if let subscriber = subscriber {
49-
callback(subscriber)
49+
lock.withLock {
50+
for subscriber in subscribers.values {
51+
callback(subscriber)
52+
}
5053
}
5154
}
5255
}

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSModelStore.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ open class OSModelStore<TModel: OSModel>: NSObject {
4747

4848
// listen for changes to the models
4949
for model in self.models.values {
50-
model.changeNotifier.subscribe(self)
50+
model.changeNotifier.subscribe(self, key: storeKey)
5151
}
5252
}
5353

@@ -96,7 +96,7 @@ open class OSModelStore<TModel: OSModel>: NSObject {
9696
OneSignalUserDefaults.initShared().saveCodeableData(forKey: self.storeKey, withValue: self.models)
9797

9898
// listen for changes to this model
99-
model.changeNotifier.subscribe(self)
99+
model.changeNotifier.subscribe(self, key: storeKey)
100100

101101
guard !hydrating else {
102102
return
@@ -121,7 +121,7 @@ open class OSModelStore<TModel: OSModel>: NSObject {
121121
OneSignalUserDefaults.initShared().saveCodeableData(forKey: self.storeKey, withValue: self.models)
122122

123123
// no longer listen for changes to this model
124-
model.changeNotifier.unsubscribe(self)
124+
model.changeNotifier.unsubscribe(self, key: storeKey)
125125

126126
self.changeSubscription.fire { modelStoreListener in
127127
modelStoreListener.onRemoved(model)

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSModelStoreListener.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@ public protocol OSModelStoreListener: OSModelStoreChangedHandler {
4444

4545
extension OSModelStoreListener {
4646
public func start() {
47-
store.changeSubscription.subscribe(self)
47+
let key = store.storeKey + OS_MODEL_STORE_LISTENER_POSTFIX
48+
store.changeSubscription.subscribe(self, key: key)
4849
}
4950

5051
public func close() {
51-
store.changeSubscription.unsubscribe(self)
52+
let key = store.storeKey + OS_MODEL_STORE_LISTENER_POSTFIX
53+
store.changeSubscription.unsubscribe(self, key: key)
5254
}
5355

5456
public func onAdded(_ model: OSModel) {

0 commit comments

Comments
 (0)