Skip to content

Commit 95689ad

Browse files
needs unit tests
1 parent ae79255 commit 95689ad

File tree

2 files changed

+28
-15
lines changed

2 files changed

+28
-15
lines changed

OptimizelySDK/Extensions/Date+Extension.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
import Foundation
2020

2121
extension Date {
22-
func minutesPastSinceNow() -> Int {
22+
func secondsPastSinceNow() -> Int {
2323
let calendar = Calendar.current
24-
return calendar.component(.minute, from: self)
24+
return calendar.component(.second, from: self)
2525
}
2626
}

OptimizelySDK/Implementation/DefaultDatafileHandler.swift

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ 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]())
22+
var timers:AtomicProperty<[String:(timer:Timer, interval:Int)]> = AtomicProperty(property: [String:(Timer,Int)]())
2323
let dataStore = DataStoreUserDefaults()
2424

2525
required init() {
@@ -95,7 +95,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
9595

9696
completionHandler(result)
9797

98-
self.logger?.log(level: .debug, message: response.debugDescription)
98+
// self.logger?.log(level: .debug, message: response.debugDescription)
9999

100100
}
101101

@@ -109,7 +109,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
109109
let now = Date()
110110
if #available(iOS 10.0, tvOS 10.0, *) {
111111
DispatchQueue.main.async {
112-
if let timer = self.timers.property?[sdkKey], timer.isValid {
112+
if let timer = self.timers.property?[sdkKey]?.timer, timer.isValid {
113113
return
114114
}
115115

@@ -123,20 +123,30 @@ class DefaultDatafileHandler : OPTDatafileHandler {
123123
timer.invalidate()
124124
}
125125
self.timers.performAtomic(atomicOperation: { (timers) in
126-
timers[sdkKey] = timer
126+
if let interval = timers[sdkKey]?.interval {
127+
timers[sdkKey] = (timer,interval)
128+
}
129+
else {
130+
timers[sdkKey] = (timer,updateInterval)
131+
}
127132
})
128133
}
129134
} else {
130135
// Fallback on earlier versions
131136
DispatchQueue.main.async {
132-
if let timer = self.timers.property?[sdkKey], timer.isValid {
137+
if let timer = self.timers.property?[sdkKey]?.timer, timer.isValid {
133138
return
134139
}
135140

136-
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)
141+
let timer = Timer.scheduledTimer(timeInterval: TimeInterval(updateInterval), target: self, selector:#selector(self.timerFired(timer:)), userInfo: ["sdkKey": sdkKey, "startTime": Date(), "updateInterval": self.timers.property?[sdkKey]?.interval ?? updateInterval, "datafileChangeNotification":datafileChangeNotification ?? { (data) in }], repeats: false)
137142

138143
self.timers.performAtomic(atomicOperation: { (timers) in
139-
timers[sdkKey] = timer
144+
if let interval = timers[sdkKey]?.interval {
145+
timers[sdkKey] = (timer,interval)
146+
}
147+
else {
148+
timers[sdkKey] = (timer,updateInterval)
149+
}
140150
})
141151
}
142152

@@ -183,12 +193,15 @@ class DefaultDatafileHandler : OPTDatafileHandler {
183193
}
184194

185195
if self.hasPeriodUpdates(sdkKey: sdkKey) {
186-
let minutesSinceFire = startTime.minutesPastSinceNow()
187-
var diff = updateInterval - minutesSinceFire
188-
if diff < 0 {
189-
diff = 0
196+
let interval = self.timers.property?[sdkKey]?.interval ?? updateInterval
197+
let actualDiff = (startTime.secondsPastSinceNow() - updateInterval)
198+
var nextInterval = interval
199+
if actualDiff > 0 {
200+
nextInterval -= actualDiff
190201
}
191-
self.startPeriodicUpdates(sdkKey: sdkKey, updateInterval: diff, datafileChangeNotification: datafileChangeNotification)
202+
203+
self.logger?.d("next datafile download is \(nextInterval) seconds \(Date())")
204+
self.startPeriodicUpdates(sdkKey: sdkKey, updateInterval: nextInterval, datafileChangeNotification: datafileChangeNotification)
192205
}
193206
}
194207
}
@@ -198,7 +211,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
198211
if let timer = timers[sdkKey] {
199212
logger?.log(level: .info, message: "Stopping timer for datafile updates sdkKey: \(sdkKey)")
200213

201-
timer.invalidate()
214+
timer.timer.invalidate()
202215
timers.removeValue(forKey: sdkKey)
203216
}
204217

0 commit comments

Comments
 (0)