@@ -19,7 +19,7 @@ import Foundation
19
19
class DefaultDatafileHandler : OPTDatafileHandler {
20
20
static public var endPointStringFormat = " https://cdn.optimizely.com/datafiles/%@.json "
21
21
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 ) ] ( ) )
23
23
let dataStore = DataStoreUserDefaults ( )
24
24
25
25
required init ( ) {
@@ -95,7 +95,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
95
95
96
96
completionHandler ( result)
97
97
98
- self . logger? . log ( level: . debug, message: response. debugDescription)
98
+ // self.logger?.log(level: .debug, message: response.debugDescription)
99
99
100
100
}
101
101
@@ -109,7 +109,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
109
109
let now = Date ( )
110
110
if #available( iOS 10 . 0 , tvOS 10 . 0 , * ) {
111
111
DispatchQueue . main. async {
112
- if let timer = self . timers. property ? [ sdkKey] , timer. isValid {
112
+ if let timer = self . timers. property ? [ sdkKey] ? . timer , timer. isValid {
113
113
return
114
114
}
115
115
@@ -123,20 +123,30 @@ class DefaultDatafileHandler : OPTDatafileHandler {
123
123
timer. invalidate ( )
124
124
}
125
125
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
+ }
127
132
} )
128
133
}
129
134
} else {
130
135
// Fallback on earlier versions
131
136
DispatchQueue . main. async {
132
- if let timer = self . timers. property ? [ sdkKey] , timer. isValid {
137
+ if let timer = self . timers. property ? [ sdkKey] ? . timer , timer. isValid {
133
138
return
134
139
}
135
140
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 )
137
142
138
143
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
+ }
140
150
} )
141
151
}
142
152
@@ -183,12 +193,15 @@ class DefaultDatafileHandler : OPTDatafileHandler {
183
193
}
184
194
185
195
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
190
201
}
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)
192
205
}
193
206
}
194
207
}
@@ -198,7 +211,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
198
211
if let timer = timers [ sdkKey] {
199
212
logger? . log ( level: . info, message: " Stopping timer for datafile updates sdkKey: \( sdkKey) " )
200
213
201
- timer. invalidate ( )
214
+ timer. timer . invalidate ( )
202
215
timers. removeValue ( forKey: sdkKey)
203
216
}
204
217
0 commit comments