Skip to content

Commit ddc14d0

Browse files
(chore):make the config a atomic property (#247)
* make the config a atomic property * add a unit test * add convenience wrapper around config for atomic property. access atomicConfig from config * change podfile version
1 parent 466ce13 commit ddc14d0

File tree

7 files changed

+28
-9
lines changed

7 files changed

+28
-9
lines changed

OptimizelySDK/Optimizely/OptimizelyClient.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,15 @@ open class OptimizelyClient: NSObject {
2424
// MARK: - Properties
2525

2626
var sdkKey: String
27-
var config: ProjectConfig?
27+
private var atomicConfig: AtomicProperty<ProjectConfig> = AtomicProperty<ProjectConfig>()
28+
var config: ProjectConfig? {
29+
get {
30+
return atomicConfig.property
31+
}
32+
set {
33+
atomicConfig.property = newValue
34+
}
35+
}
2836

2937
public var version: String {
3038
return Utils.sdkVersion
@@ -52,8 +60,6 @@ open class OptimizelyClient: NSObject {
5260
return HandlerRegistryService.shared.injectNotificationCenter(sdkKey: self.sdkKey)!
5361
}
5462

55-
private let reInitLock = Dispatch.DispatchSemaphore(value: 1)
56-
5763
// MARK: - Public interfaces
5864

5965
/// Optimizely Manager
@@ -151,7 +157,6 @@ open class OptimizelyClient: NSObject {
151157

152158
datafileHandler.startUpdates(sdkKey: self.sdkKey) { data in
153159
// new datafile came in...
154-
self.reInitLock.wait(); defer { self.reInitLock.signal() }
155160
if let config = try? ProjectConfig(datafile: data) {
156161
do {
157162
if let users = self.config?.whitelistUsers {

OptimizelySDK/OptimizelyTests/OptimizelyTests-APIs/OptimizelyClientTests_Valid.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,20 @@ class OptimizelyClientTests_Valid: XCTestCase {
5959
try! self.optimizely.start(datafile: datafile)
6060
}
6161

62+
func testMultiStart() {
63+
try! self.optimizely.start(datafile: datafile)
64+
try! self.optimizely.start(datafile: datafile)
65+
DispatchQueue.global().async {
66+
for _ in 0...10 {
67+
try! self.optimizely.start(datafile: self.datafile)
68+
}
69+
}
70+
sleep(1)
71+
let variationKey: String = try! self.optimizely.activate(experimentKey: kExperimentKey, userId: kUserId)
72+
XCTAssert(variationKey == kVariationKey)
73+
74+
}
75+
6276
func testActivate() {
6377
let variationKey: String = try! self.optimizely.activate(experimentKey: kExperimentKey, userId: kUserId)
6478
XCTAssert(variationKey == kVariationKey)

OptimizelySDK/OptimizelyTests/OptimizelyTests-Common/BatchEventBuilderTests_Attributes.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ class BatchEventBuilderTests_Attributes: XCTestCase {
192192

193193
func testEventAttributesWhenAttributesEmpty() {
194194
// clear all audience conditions to accept empty attributes
195-
var experiment = optimizely.config!.project!.experiments.filter({$0.key == experimentKey}).first!
195+
var experiment = optimizely.config!.project.experiments.filter({$0.key == experimentKey}).first!
196196
experiment.audienceConditions = nil
197197
experiment.audienceIds = []
198198
optimizely.config!.project!.experiments = [experiment]

OptimizelySDK/OptimizelyTests/OptimizelyTests-Common/BatchEventBuilderTests_EventTags.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class BatchEventBuilderTests_EventTags: XCTestCase {
3131
optimizely = OTUtils.createOptimizely(datafileName: "audience_targeting",
3232
clearUserProfileService: true,
3333
eventDispatcher: eventDispatcher)!
34-
project = optimizely.config!.project!
34+
project = optimizely.config!.project
3535
}
3636

3737
func testEventTags() {

OptimizelySDK/OptimizelyTests/OptimizelyTests-Common/BucketTests_BucketVariation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class BucketTests_BucketVariation: XCTestCase {
109109

110110
self.optimizely = OTUtils.createOptimizely(datafileName: "empty_datafile",
111111
clearUserProfileService: true)
112-
self.config = self.optimizely.config!
112+
self.config = self.optimizely.config
113113
self.bucketer = ((optimizely.decisionService as! DefaultDecisionService).bucketer as! DefaultBucketer)
114114
}
115115

OptimizelySDK/OptimizelyTests/OptimizelyTests-Common/BucketTests_GroupToExp.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class BucketTests_GroupToExp: XCTestCase {
105105

106106
self.optimizely = OTUtils.createOptimizely(datafileName: "empty_datafile",
107107
clearUserProfileService: true)
108-
self.config = self.optimizely.config!
108+
self.config = self.optimizely.config
109109
self.bucketer = ((optimizely.decisionService as! DefaultDecisionService).bucketer as! DefaultBucketer)
110110
}
111111

OptimizelySDK/OptimizelyTests/OptimizelyTests-Common/DecisionServiceTests_UserProfiles.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class DecisionServiceTests_UserProfiles: XCTestCase {
5656

5757
self.optimizely = OTUtils.createOptimizely(datafileName: "empty_datafile",
5858
clearUserProfileService: true)
59-
self.config = self.optimizely.config!
59+
self.config = self.optimizely.config
6060
self.decisionService = (optimizely.decisionService as! DefaultDecisionService)
6161
}
6262

0 commit comments

Comments
 (0)