@@ -22,6 +22,8 @@ class DefaultDatafileHandler : OPTDatafileHandler {
22
22
var timers : AtomicProperty < [ String : ( timer: Timer , interval: Int ) ] > = AtomicProperty ( property: [ String: ( Timer, Int) ] ( ) )
23
23
let dataStore = DataStoreUserDefaults ( )
24
24
25
+ let downloadQueue = DispatchQueue ( label: " DefaultDatafileHandlerQueue " , qos: DispatchQoS . default, attributes: DispatchQueue . Attributes. concurrent, autoreleaseFrequency: DispatchQueue . AutoreleaseFrequency. inherit, target: nil )
26
+
25
27
required init ( ) {
26
28
27
29
}
@@ -48,23 +50,54 @@ class DefaultDatafileHandler : OPTDatafileHandler {
48
50
return datafile
49
51
}
50
52
51
- open func downloadDatafile( sdkKey: String ,
52
- resourceTimeoutInterval: Double ? = nil ,
53
- completionHandler: @escaping DatafileDownloadCompletionHandler ) {
53
+ open func getSession( resourceTimeoutInterval: Double ? ) -> URLSession {
54
54
let config = URLSessionConfiguration . ephemeral
55
55
if let resourceTimeoutInterval = resourceTimeoutInterval,
56
56
resourceTimeoutInterval > 0 {
57
57
config. timeoutIntervalForResource = TimeInterval ( resourceTimeoutInterval)
58
58
}
59
- let session = URLSession ( configuration: config)
59
+ return URLSession ( configuration: config)
60
+ }
61
+
62
+ open func getRequest( sdkKey: String ) -> URLRequest ? {
60
63
let str = String ( format: DefaultDatafileHandler . endPointStringFormat, sdkKey)
61
- if let url = URL ( string: str) {
62
- var request = URLRequest ( url: url)
63
-
64
- if let lastModified = dataStore. getItem ( forKey: " OPTLastModified- " + sdkKey) {
65
- request. addValue ( lastModified as! String , forHTTPHeaderField: " If-Modified-Since " )
64
+ guard let url = URL ( string: str) else { return nil }
65
+
66
+ var request = URLRequest ( url: url)
67
+
68
+ if let lastModified = dataStore. getItem ( forKey: " OPTLastModified- " + sdkKey) {
69
+ request. addValue ( lastModified as! String , forHTTPHeaderField: " If-Modified-Since " )
70
+ }
71
+
72
+ return request
73
+
74
+ }
75
+
76
+ open func getResponseData( sdkKey: String , response: HTTPURLResponse , url: URL ? ) -> Data ? {
77
+ if let url = url, let data = try ? Data ( contentsOf: url) {
78
+ if let str = String ( data: data, encoding: . utf8) {
79
+ self . logger? . log ( level: . debug, message: str)
80
+ }
81
+ self . saveDatafile ( sdkKey: sdkKey, dataFile: data)
82
+ if let lastModified = response. allHeaderFields [ " Last-Modified " ] {
83
+ self . dataStore. saveItem ( forKey: " OPTLastModified- " + sdkKey, value: lastModified)
66
84
}
67
85
86
+ return data
87
+ }
88
+
89
+ return nil
90
+ }
91
+
92
+ open func downloadDatafile( sdkKey: String ,
93
+ resourceTimeoutInterval: Double ? = nil ,
94
+ completionHandler: @escaping DatafileDownloadCompletionHandler ) {
95
+
96
+ downloadQueue. async {
97
+ let session = self . getSession ( resourceTimeoutInterval: resourceTimeoutInterval)
98
+
99
+ guard let request = self . getRequest ( sdkKey: sdkKey) else { return }
100
+
68
101
let task = session. downloadTask ( with: request) { ( url, response, error) in
69
102
var result = OptimizelyResult< Data?> . failure( . datafileDownloadFailed( " Failed to parse " ) )
70
103
@@ -73,31 +106,22 @@ class DefaultDatafileHandler : OPTDatafileHandler {
73
106
result = . failure( . datafileDownloadFailed( error. debugDescription) )
74
107
} else if let response = response as? HTTPURLResponse {
75
108
if response. statusCode == 200 {
76
- if let url = url, let data = try ? Data ( contentsOf: url) {
77
- if let str = String ( data: data, encoding: . utf8) {
78
- self . logger? . d ( str)
79
- }
80
- self . saveDatafile ( sdkKey: sdkKey, dataFile: data)
81
- if let lastModified = response. allHeaderFields [ " Last-Modified " ] {
82
- self . dataStore. saveItem ( forKey: " OPTLastModified- " + sdkKey, value: lastModified)
83
- }
84
-
85
- result = . success( data)
86
- }
87
- } else if response. statusCode == 304 {
88
- self . logger? . d ( " The datafile was not modified and won't be downloaded again " )
109
+ let data = self . getResponseData ( sdkKey: sdkKey, response: response, url: url)
110
+ result = Result . success ( data)
111
+ }
112
+ else if response. statusCode == 304 {
113
+ self . logger? . log ( level: . debug, message: " The datafile was not modified and won't be downloaded again " )
89
114
result = . success( nil )
90
115
}
91
116
}
92
-
117
+
93
118
completionHandler ( result)
94
119
95
120
//self.logger?.d(response.debugDescription)
96
121
}
97
122
98
123
task. resume ( )
99
124
}
100
-
101
125
}
102
126
103
127
func startPeriodicUpdates( sdkKey: String , updateInterval: Int , datafileChangeNotification: ( ( Data ) -> Void ) ? ) {
0 commit comments