Skip to content

Commit ef61699

Browse files
committed
fix conflicts
2 parents 351cbaa + 423607e commit ef61699

File tree

10 files changed

+211
-92
lines changed

10 files changed

+211
-92
lines changed

OptimizelySDK/Data Model/ProjectConfig.swift

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ class ProjectConfig {
2424
// local runtime forcedVariations [UserId: [ExperimentId: VariationId]]
2525
// NOTE: experiment.forcedVariations use [ExperimentKey: VariationKey] instead of ids
2626

27-
private var whitelistUsers = [String: [String: String]]()
28-
private var experimentFeatureMap = [String: [String]]()
27+
var whitelistUsers = [String: [String: String]]()
2928

3029
init(datafile: Data) throws {
3130
do {
@@ -36,7 +35,6 @@ class ProjectConfig {
3635
if !isValidVersion(version: self.project.version) {
3736
throw OptimizelyError.dataFileVersionInvalid(self.project.version)
3837
}
39-
generateExperimentFeatureMap()
4038
}
4139

4240
convenience init(datafile: String) throws {
@@ -90,20 +88,6 @@ extension ProjectConfig {
9088
// old versions (< 4) of datafiles not supported
9189
return ["4"].contains(version)
9290
}
93-
94-
private func generateExperimentFeatureMap() {
95-
for feature in project.featureFlags {
96-
for id in feature.experimentIds {
97-
if var featureIdArray = experimentFeatureMap[id] {
98-
featureIdArray.append(feature.id)
99-
experimentFeatureMap[id] = featureIdArray
100-
}
101-
else {
102-
experimentFeatureMap[id] = [feature.id]
103-
}
104-
}
105-
}
106-
}
10791
}
10892

10993
// MARK: - Project Access
@@ -192,7 +176,12 @@ extension ProjectConfig {
192176
* Returns true if experiment belongs to any feature, false otherwise.
193177
*/
194178
func isFeatureExperiment(id: String) -> Bool {
195-
return experimentFeatureMap.keys.contains(id)
179+
if let _ = project.featureFlags.map({ $0.experimentIds.contains(id)}).first {
180+
return true
181+
}
182+
else {
183+
return false
184+
}
196185
}
197186

198187
/**

OptimizelySDK/Extensions/Date+Extension.swift

Lines changed: 0 additions & 26 deletions
This file was deleted.

OptimizelySDK/Implementation/DefaultDatafileHandler.swift

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ import Foundation
1919
class DefaultDatafileHandler : OPTDatafileHandler {
2020
static public var endPointStringFormat = "https://cdn.optimizely.com/datafiles/%@.json"
2121
lazy var logger = HandlerRegistryService.shared.injectLogger()
22-
var timers:AtomicProperty<[String:Timer]> = AtomicProperty(property: [String:Timer]())
23-
let dataStore = DataStoreUserDefaults()
22+
var timers:AtomicProperty<[String:(timer:Timer, interval:Int)]> = AtomicProperty(property: [String:(Timer,Int)]())
23+
let dataStore = DataStoreUserDefaults()x
2424

2525
required init() {
2626

@@ -92,8 +92,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
9292

9393
completionHandler(result)
9494

95-
self.logger?.d(response.debugDescription)
96-
95+
//self.logger?.d(response.debugDescription)
9796
}
9897

9998
task.resume()
@@ -106,7 +105,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
106105
let now = Date()
107106
if #available(iOS 10.0, tvOS 10.0, *) {
108107
DispatchQueue.main.async {
109-
if let timer = self.timers.property?[sdkKey], timer.isValid {
108+
if let timer = self.timers.property?[sdkKey]?.timer, timer.isValid {
110109
return
111110
}
112111

@@ -120,20 +119,30 @@ class DefaultDatafileHandler : OPTDatafileHandler {
120119
timer.invalidate()
121120
}
122121
self.timers.performAtomic(atomicOperation: { (timers) in
123-
timers[sdkKey] = timer
122+
if let interval = timers[sdkKey]?.interval {
123+
timers[sdkKey] = (timer,interval)
124+
}
125+
else {
126+
timers[sdkKey] = (timer,updateInterval)
127+
}
124128
})
125129
}
126130
} else {
127131
// Fallback on earlier versions
128132
DispatchQueue.main.async {
129-
if let timer = self.timers.property?[sdkKey], timer.isValid {
133+
if let timer = self.timers.property?[sdkKey]?.timer, timer.isValid {
130134
return
131135
}
132136

133-
let timer = Timer.scheduledTimer(timeInterval: TimeInterval(updateInterval), target: self, selector:#selector(self.timerFired(timer:)), userInfo: ["sdkKey": sdkKey, "startTime": Date(), "updateInterval":updateInterval, "datafileChangeNotification":datafileChangeNotification ?? { (data) in }], repeats: false)
137+
let timer = Timer.scheduledTimer(timeInterval: TimeInterval(updateInterval), target: self, selector:#selector(self.timerFired(timer:)), userInfo: ["sdkKey": sdkKey, "startTime": Date(), "updateInterval": updateInterval, "datafileChangeNotification":datafileChangeNotification ?? { (data) in }], repeats: false)
134138

135139
self.timers.performAtomic(atomicOperation: { (timers) in
136-
timers[sdkKey] = timer
140+
if let interval = timers[sdkKey]?.interval {
141+
timers[sdkKey] = (timer,interval)
142+
}
143+
else {
144+
timers[sdkKey] = (timer,updateInterval)
145+
}
137146
})
138147
}
139148

@@ -145,7 +154,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
145154
if let info = timer.userInfo as? [String:Any],
146155
let sdkKey = info["sdkKey"] as? String,
147156
let updateInterval = info["updateInterval"] as? Int,
148-
let startDate = info["startDate"] as? Date,
157+
let startDate = info["startTime"] as? Date,
149158
let datafileChangeNotification = info["datafileChangeNotification"] as? ((Data)->Void){
150159
self.performPerodicDownload(sdkKey: sdkKey, startTime: startDate, updateInterval: updateInterval, datafileChangeNotification: datafileChangeNotification)
151160
}
@@ -180,12 +189,15 @@ class DefaultDatafileHandler : OPTDatafileHandler {
180189
}
181190

182191
if self.hasPeriodUpdates(sdkKey: sdkKey) {
183-
let minutesSinceFire = startTime.minutesPastSinceNow()
184-
var diff = updateInterval - minutesSinceFire
185-
if diff < 0 {
186-
diff = 0
192+
let interval = self.timers.property?[sdkKey]?.interval ?? updateInterval
193+
let actualDiff = (Int(abs(startTime.timeIntervalSinceNow)) - updateInterval)
194+
var nextInterval = interval
195+
if actualDiff > 0 {
196+
nextInterval -= actualDiff
187197
}
188-
self.startPeriodicUpdates(sdkKey: sdkKey, updateInterval: diff, datafileChangeNotification: datafileChangeNotification)
198+
199+
self.logger?.d("next datafile download is \(nextInterval) seconds \(Date())")
200+
self.startPeriodicUpdates(sdkKey: sdkKey, updateInterval: nextInterval, datafileChangeNotification: datafileChangeNotification)
189201
}
190202
}
191203
}
@@ -195,19 +207,17 @@ class DefaultDatafileHandler : OPTDatafileHandler {
195207
if let timer = timers[sdkKey] {
196208
logger?.i("Stopping timer for datafile updates sdkKey: \(sdkKey)")
197209

198-
timer.invalidate()
210+
timer.timer.invalidate()
199211
timers.removeValue(forKey: sdkKey)
200212
}
201213

202214
}
203215
}
204216

205217
func stopPeriodicUpdates() {
206-
timers.performAtomic { (timers) in
207-
for key in timers.keys {
208-
logger?.i("Stopping timer for all datafile updates")
209-
stopPeriodicUpdates(sdkKey: key)
210-
}
218+
for key in timers.property?.keys ?? Dictionary<String, (timer: Timer, interval: Int)>().keys {
219+
logger?.i("Stopping timer for all datafile updates")
220+
stopPeriodicUpdates(sdkKey: key)
211221
}
212222

213223
}

OptimizelySDK/Optimizely/OptimizelyManager.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,11 @@ open class OptimizelyManager: NSObject {
157157
// new datafile came in...
158158
self.reInitLock.wait(); defer { self.reInitLock.signal() }
159159
if let config = try? ProjectConfig(datafile: data) {
160-
161160
do {
161+
if let users = self.config?.whitelistUsers {
162+
config.whitelistUsers = users
163+
}
164+
162165
self.config = config
163166

164167
// call reinit on the services we know we are reinitializing.

0 commit comments

Comments
 (0)