@@ -109,21 +109,7 @@ class DefaultDatafileHandler : OPTDatafileHandler {
109
109
DispatchQueue . main. async {
110
110
let timer = Timer . scheduledTimer ( withTimeInterval: TimeInterval ( updateInterval) , repeats: false ) { ( timer) in
111
111
112
- self . downloadDatafile ( sdkKey: sdkKey) { ( result) in
113
- switch result {
114
- case . success( let data) :
115
- if let data = data,
116
- let datafileChangeNotification = datafileChangeNotification {
117
- datafileChangeNotification ( data)
118
- }
119
- case . failure( let error) :
120
- self . logger? . log ( level: . error, message: error. localizedDescription)
121
- }
122
-
123
- if self . hasPeriodUpdates ( sdkKey: sdkKey) {
124
- self . startPeriodicUpdates ( sdkKey: sdkKey, updateInterval: updateInterval, datafileChangeNotification: datafileChangeNotification)
125
- }
126
- }
112
+ self . performPerodicDownload ( sdkKey: sdkKey, updateInterval: updateInterval, datafileChangeNotification: datafileChangeNotification)
127
113
128
114
timer. invalidate ( )
129
115
}
@@ -133,9 +119,29 @@ class DefaultDatafileHandler : OPTDatafileHandler {
133
119
}
134
120
} else {
135
121
// Fallback on earlier versions
122
+ DispatchQueue . main. async {
123
+ let timer = Timer . scheduledTimer ( timeInterval: TimeInterval ( updateInterval) , target: self , selector: #selector( self . timerFired ( timer: ) ) , userInfo: [ " sdkKey " : sdkKey, " updateInterval " : updateInterval, " datafileChangeNotification " : datafileChangeNotification ?? { ( data) in } ] , repeats: false )
124
+
125
+ self . timers. performAtomic ( atomicOperation: { ( timers) in
126
+ timers [ sdkKey] = timer
127
+ } )
128
+ }
129
+
136
130
}
137
131
}
138
132
133
+ @objc
134
+ func timerFired( timer: Timer ) {
135
+ if let info = timer. userInfo as? [ String : Any ] ,
136
+ let sdkKey = info [ " sdkKey " ] as? String ,
137
+ let updateInterval = info [ " updateInterval " ] as? Int ,
138
+ let datafileChangeNotification = info [ " datafileChangeNotification " ] as? ( ( Data ) -> Void ) {
139
+ self . performPerodicDownload ( sdkKey: sdkKey, updateInterval: updateInterval, datafileChangeNotification: datafileChangeNotification)
140
+ }
141
+ timer. invalidate ( )
142
+
143
+ }
144
+
139
145
func hasPeriodUpdates( sdkKey: String ) -> Bool {
140
146
var restart = true
141
147
self . timers. performAtomic ( atomicOperation: { ( timers) in
@@ -147,6 +153,26 @@ class DefaultDatafileHandler : OPTDatafileHandler {
147
153
return restart
148
154
}
149
155
156
+ func performPerodicDownload( sdkKey: String ,
157
+ updateInterval: Int ,
158
+ datafileChangeNotification: ( ( Data ) -> Void ) ? ) {
159
+ self . downloadDatafile ( sdkKey: sdkKey) { ( result) in
160
+ switch result {
161
+ case . success( let data) :
162
+ if let data = data,
163
+ let datafileChangeNotification = datafileChangeNotification {
164
+ datafileChangeNotification ( data)
165
+ }
166
+ case . failure( let error) :
167
+ self . logger? . log ( level: . error, message: error. localizedDescription)
168
+ }
169
+
170
+ if self . hasPeriodUpdates ( sdkKey: sdkKey) {
171
+ self . startPeriodicUpdates ( sdkKey: sdkKey, updateInterval: updateInterval, datafileChangeNotification: datafileChangeNotification)
172
+ }
173
+ }
174
+ }
175
+
150
176
func stopPeriodicUpdates( sdkKey: String ) {
151
177
timers. performAtomic { ( timers) in
152
178
if let timer = timers [ sdkKey] {
0 commit comments