@@ -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 = Result < Data ? , DatafileDownloadError > . failure ( DatafileDownloadError ( description: " Failed to parse " ) )
70
103
@@ -75,24 +108,15 @@ class DefaultDatafileHandler : OPTDatafileHandler {
75
108
}
76
109
else if let response = response as? HTTPURLResponse {
77
110
if response. statusCode == 200 {
78
- if let url = url, let data = try ? Data ( contentsOf: url) {
79
- if let str = String ( data: data, encoding: . utf8) {
80
- self . logger? . log ( level: . debug, message: str)
81
- }
82
- self . saveDatafile ( sdkKey: sdkKey, dataFile: data)
83
- if let lastModified = response. allHeaderFields [ " Last-Modified " ] {
84
- self . dataStore. saveItem ( forKey: " OPTLastModified- " + sdkKey, value: lastModified)
85
- }
86
-
87
- result = Result . success ( data)
88
- }
111
+ let data = self . getResponseData ( sdkKey: sdkKey, response: response, url: url)
112
+ result = Result . success ( data)
89
113
}
90
114
else if response. statusCode == 304 {
91
115
self . logger? . log ( level: . debug, message: " The datafile was not modified and won't be downloaded again " )
92
116
result = . success( nil )
93
117
}
94
118
}
95
-
119
+
96
120
completionHandler ( result)
97
121
98
122
// self.logger?.log(level: .debug, message: response.debugDescription)
@@ -101,7 +125,6 @@ class DefaultDatafileHandler : OPTDatafileHandler {
101
125
102
126
task. resume ( )
103
127
}
104
-
105
128
}
106
129
107
130
func startPeriodicUpdates( sdkKey: String , updateInterval: Int , datafileChangeNotification: ( ( Data ) -> Void ) ? ) {
0 commit comments