@@ -19,8 +19,8 @@ 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] ( ) )
23
- let dataStore = DataStoreUserDefaults ( )
22
+ var timers : AtomicProperty < [ String : ( timer : Timer , interval : Int ) ] > = AtomicProperty ( property: [ String: ( Timer, Int ) ] ( ) )
23
+ let dataStore = DataStoreUserDefaults ( ) x
24
24
25
25
required init ( ) {
26
26
@@ -92,8 +92,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
92
92
93
93
completionHandler ( result)
94
94
95
- self . logger? . d ( response. debugDescription)
96
-
95
+ //self.logger?.d(response.debugDescription)
97
96
}
98
97
99
98
task. resume ( )
@@ -106,7 +105,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
106
105
let now = Date ( )
107
106
if #available( iOS 10 . 0 , tvOS 10 . 0 , * ) {
108
107
DispatchQueue . main. async {
109
- if let timer = self . timers. property ? [ sdkKey] , timer. isValid {
108
+ if let timer = self . timers. property ? [ sdkKey] ? . timer , timer. isValid {
110
109
return
111
110
}
112
111
@@ -120,20 +119,30 @@ class DefaultDatafileHandler : OPTDatafileHandler {
120
119
timer. invalidate ( )
121
120
}
122
121
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
+ }
124
128
} )
125
129
}
126
130
} else {
127
131
// Fallback on earlier versions
128
132
DispatchQueue . main. async {
129
- if let timer = self . timers. property ? [ sdkKey] , timer. isValid {
133
+ if let timer = self . timers. property ? [ sdkKey] ? . timer , timer. isValid {
130
134
return
131
135
}
132
136
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 )
134
138
135
139
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
+ }
137
146
} )
138
147
}
139
148
@@ -145,7 +154,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
145
154
if let info = timer. userInfo as? [ String : Any ] ,
146
155
let sdkKey = info [ " sdkKey " ] as? String ,
147
156
let updateInterval = info [ " updateInterval " ] as? Int ,
148
- let startDate = info [ " startDate " ] as? Date ,
157
+ let startDate = info [ " startTime " ] as? Date ,
149
158
let datafileChangeNotification = info [ " datafileChangeNotification " ] as? ( ( Data ) -> Void ) {
150
159
self . performPerodicDownload ( sdkKey: sdkKey, startTime: startDate, updateInterval: updateInterval, datafileChangeNotification: datafileChangeNotification)
151
160
}
@@ -180,12 +189,15 @@ class DefaultDatafileHandler : OPTDatafileHandler {
180
189
}
181
190
182
191
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
187
197
}
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)
189
201
}
190
202
}
191
203
}
@@ -195,19 +207,17 @@ class DefaultDatafileHandler : OPTDatafileHandler {
195
207
if let timer = timers [ sdkKey] {
196
208
logger? . i ( " Stopping timer for datafile updates sdkKey: \( sdkKey) " )
197
209
198
- timer. invalidate ( )
210
+ timer. timer . invalidate ( )
199
211
timers. removeValue ( forKey: sdkKey)
200
212
}
201
213
202
214
}
203
215
}
204
216
205
217
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)
211
221
}
212
222
213
223
}
0 commit comments