Skip to content

Commit 984b0f2

Browse files
start refactor
1 parent 42a85f9 commit 984b0f2

File tree

1 file changed

+50
-47
lines changed

1 file changed

+50
-47
lines changed

OptimizelySDK/Implementation/DefaultDatafileHandler.swift

Lines changed: 50 additions & 47 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:[String:Timer] = [String:Timer]()
22+
var timers:AtomicProperty<[String:Timer]> = AtomicProperty(property: [String:Timer]())
2323
let dataStore = DataStoreUserDefaults()
2424

2525
required init() {
@@ -28,34 +28,27 @@ class DefaultDatafileHandler : OPTDatafileHandler {
2828

2929
func downloadDatafile(sdkKey: String) -> Data? {
3030

31-
let config = URLSessionConfiguration.ephemeral
32-
let session = URLSession(configuration: config)
33-
let str = String(format: DefaultDatafileHandler.endPointStringFormat, sdkKey)
34-
var result:Data?
31+
var datafile:Data?
3532
let group = DispatchGroup()
3633

3734
group.enter()
3835

39-
if let url = URL(string: str) {
40-
let task = session.downloadTask(with: url){ (url, response, error) in
41-
self.logger?.log(level: .debug, message: response.debugDescription)
42-
if let response = response as? HTTPURLResponse, response.statusCode == 200,
43-
let url = url, let projectConfig = try? Data(contentsOf: url) {
44-
result = projectConfig
45-
self.saveDatafile(sdkKey: sdkKey, dataFile: projectConfig)
46-
}
47-
group.leave()
36+
downloadDatafile(sdkKey: sdkKey) { (result) in
37+
switch result {
38+
case .success(let data):
39+
datafile = data
40+
case .failure(let error):
41+
self.logger?.log(level: .error, message: error.localizedDescription)
4842
}
49-
50-
task.resume()
51-
52-
group.wait()
53-
43+
group.leave()
5444
}
55-
return result
45+
46+
group.wait()
47+
48+
return datafile
5649
}
5750

58-
open func downloadDatafile(sdkKey: String, completionHandler: @escaping (Result<Data?, DatafileDownloadError>) -> Void) {
51+
open func downloadDatafile(sdkKey: String, completionHandler: @escaping DatafileDownloadCompletionHandler) {
5952
let config = URLSessionConfiguration.ephemeral
6053
let session = URLSession(configuration: config)
6154
let str = String(format: DefaultDatafileHandler.endPointStringFormat, sdkKey)
@@ -106,49 +99,59 @@ class DefaultDatafileHandler : OPTDatafileHandler {
10699
}
107100

108101
func startPeriodicUpdates(sdkKey: String, updateInterval: Int, datafileChangeNotification:((Data)->Void)?) {
109-
if let _ = timers[sdkKey] {
110-
logger?.log(level: .info, message: "Timer already started for datafile updates")
111-
return
102+
103+
timers.performAtomic { (timers) in
104+
if let timer = timers[sdkKey] {
105+
logger?.log(level: .info, message: "Timer getting restarted for datafile updates \(sdkKey)")
106+
timer.invalidate()
107+
timers[sdkKey] = nil
108+
//return
109+
}
112110
}
113111
if #available(iOS 10.0, tvOS 10.0, *) {
114112
DispatchQueue.main.async {
115-
let timer = Timer.scheduledTimer(withTimeInterval: TimeInterval(updateInterval), repeats: true) { (timer) in
116-
self.downloadDatafile(sdkKey: sdkKey) { (result) in
117-
if let datafileChangeNotification = datafileChangeNotification {
118-
switch result {
119-
case .success(let data):
120-
if let data = data {
121-
datafileChangeNotification(data)
122-
}
123-
case .failure( _): break
124-
// don't do anything.
113+
let timer = Timer.scheduledTimer(withTimeInterval: TimeInterval(updateInterval), repeats: false) { (timer) in
114+
115+
self.downloadDatafile(sdkKey: sdkKey, completionHandler: { (result) in
116+
switch result {
117+
case .success(let data):
118+
if let data = data,
119+
let datafileChangeNotification = datafileChangeNotification {
120+
datafileChangeNotification(data)
125121
}
122+
case .failure(let error):
123+
self.logger?.log(level: .error, message: error.localizedDescription)
126124
}
127-
// background download saves to cache
128-
}
125+
self.startPeriodicUpdates(sdkKey: sdkKey, updateInterval: updateInterval, datafileChangeNotification: datafileChangeNotification)
126+
})
129127
}
130-
self.timers[sdkKey] = timer
131-
128+
self.timers.performAtomic(atomicOperation: { (timers) in
129+
timers[sdkKey] = timer
130+
})
132131
}
133132
} else {
134133
// Fallback on earlier versions
135134
}
136135
}
137136

138137
func stopPeriodicUpdates(sdkKey: String) {
139-
if let timer = timers[sdkKey] {
140-
logger?.log(level: .info, message: "Stopping timer for datafile updates sdkKey:" + sdkKey)
141-
142-
timer.invalidate()
143-
timers.removeValue(forKey: sdkKey)
144-
}
138+
timers.performAtomic { (timers) in
139+
if let timer = timers[sdkKey] {
140+
logger?.log(level: .info, message: "Stopping timer for datafile updates sdkKey: \(sdkKey)")
141+
142+
timer.invalidate()
143+
timers.removeValue(forKey: sdkKey)
144+
}
145145

146+
}
146147
}
147148

148149
func stopPeriodicUpdates() {
149-
for key in timers.keys {
150-
logger?.log(level: .info, message: "Stopping timer for all datafile updates")
151-
stopPeriodicUpdates(sdkKey: key)
150+
timers.performAtomic { (timers) in
151+
for key in timers.keys {
152+
logger?.log(level: .info, message: "Stopping timer for all datafile updates")
153+
stopPeriodicUpdates(sdkKey: key)
154+
}
152155
}
153156

154157
}

0 commit comments

Comments
 (0)