diff --git a/DevCycle/Models/DVCConfig.swift b/DevCycle/Models/DVCConfig.swift index 0993b1b..93c91e0 100644 --- a/DevCycle/Models/DVCConfig.swift +++ b/DevCycle/Models/DVCConfig.swift @@ -9,18 +9,34 @@ import Foundation public class DVCConfig { var sdkKey: String var user: DevCycleUser + private let userConfigQueue = DispatchQueue( + label: "com.devcycle.userConfig", attributes: .concurrent) + private var _userConfig: UserConfig? + var userConfig: UserConfig? { - didSet { - if let userConfig = self.userConfig { - NotificationCenter.default.post( - name: Notification.Name(NotificationNames.NewUserConfig), - object: self, - userInfo: ["new-user-config" : userConfig] - ) + get { + return userConfigQueue.sync { _userConfig } + } + set { + // Synchronously set using a barrier to preserve existing semantics + userConfigQueue.async(flags: .barrier) { + self._userConfig = newValue + if let userConfig = newValue { + DispatchQueue.main.async { + NotificationCenter.default.post( + name: Notification.Name(NotificationNames.NewUserConfig), + object: self, + userInfo: ["new-user-config": userConfig] + ) + } + } } + // Fence: wait for the async barrier write above to complete so subsequent reads + // observe the new value immediately (mirrors original didSet synchronous behavior). + userConfigQueue.sync {} } } - + init(sdkKey: String, user: DevCycleUser) { self.sdkKey = sdkKey self.user = user diff --git a/DevCycleTests/Utils/GetTestConfig.swift b/DevCycleTests/Utils/GetTestConfig.swift index 2fb771b..79f71f7 100644 --- a/DevCycleTests/Utils/GetTestConfig.swift +++ b/DevCycleTests/Utils/GetTestConfig.swift @@ -6,10 +6,18 @@ // import Foundation +import XCTest func getConfigData(name: String, withExtension: String = "json") -> Data { - let bundle = Bundle(for: DevCycleClientTest.self) - let fileUrl = bundle.url(forResource: name, withExtension: withExtension) - let data = try! Data(contentsOf: fileUrl!) + #if SWIFT_PACKAGE + let bundle = Bundle.module + #else + let bundle = Bundle(for: DevCycleClientTest.self) + #endif + guard let fileUrl = bundle.url(forResource: name, withExtension: withExtension) else { + XCTFail("Missing test resource: \(name).\(withExtension)") + return Data() + } + let data = try! Data(contentsOf: fileUrl) return data } diff --git a/Package.swift b/Package.swift index eb4be42..d3503b6 100644 --- a/Package.swift +++ b/Package.swift @@ -36,7 +36,11 @@ let package = Package( name: "DevCycleTests", dependencies: ["DevCycle"], path: "DevCycleTests", - exclude: ["ObjC"] + exclude: ["ObjC"], + resources: [ + .process("Models/test_config.json"), + .process("Models/test_config_eval_reason.json"), + ] ), .testTarget( name: "DevCycleTests-ObjC",