@@ -48,8 +48,13 @@ class DefaultDatafileHandler : OPTDatafileHandler {
48
48
return datafile
49
49
}
50
50
51
- open func downloadDatafile( sdkKey: String , completionHandler: @escaping DatafileDownloadCompletionHandler ) {
51
+ open func downloadDatafile( sdkKey: String ,
52
+ resourceTimeoutInterval: Double = - 1 ,
53
+ completionHandler: @escaping DatafileDownloadCompletionHandler ) {
52
54
let config = URLSessionConfiguration . ephemeral
55
+ if resourceTimeoutInterval > 0 {
56
+ config. timeoutIntervalForResource = TimeInterval ( resourceTimeoutInterval)
57
+ }
53
58
let session = URLSession ( configuration: config)
54
59
let str = String ( format: DefaultDatafileHandler . endPointStringFormat, sdkKey)
55
60
if let url = URL ( string: str) {
@@ -100,19 +105,11 @@ class DefaultDatafileHandler : OPTDatafileHandler {
100
105
101
106
func startPeriodicUpdates( sdkKey: String , updateInterval: Int , datafileChangeNotification: ( ( Data ) -> Void ) ? ) {
102
107
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
- }
110
- }
111
108
if #available( iOS 10 . 0 , tvOS 10 . 0 , * ) {
112
109
DispatchQueue . main. async {
113
110
let timer = Timer . scheduledTimer ( withTimeInterval: TimeInterval ( updateInterval) , repeats: false ) { ( timer) in
114
111
115
- self . downloadDatafile ( sdkKey: sdkKey, completionHandler : { ( result) in
112
+ self . downloadDatafile ( sdkKey: sdkKey) { ( result) in
116
113
switch result {
117
114
case . success( let data) :
118
115
if let data = data,
@@ -122,8 +119,13 @@ class DefaultDatafileHandler : OPTDatafileHandler {
122
119
case . failure( let error) :
123
120
self . logger? . log ( level: . error, message: error. localizedDescription)
124
121
}
125
- self . startPeriodicUpdates ( sdkKey: sdkKey, updateInterval: updateInterval, datafileChangeNotification: datafileChangeNotification)
126
- } )
122
+
123
+ if self . hasPeriodUpdates ( sdkKey: sdkKey) {
124
+ self . startPeriodicUpdates ( sdkKey: sdkKey, updateInterval: updateInterval, datafileChangeNotification: datafileChangeNotification)
125
+ }
126
+ }
127
+
128
+ timer. invalidate ( )
127
129
}
128
130
self . timers. performAtomic ( atomicOperation: { ( timers) in
129
131
timers [ sdkKey] = timer
@@ -134,6 +136,17 @@ class DefaultDatafileHandler : OPTDatafileHandler {
134
136
}
135
137
}
136
138
139
+ func hasPeriodUpdates( sdkKey: String ) -> Bool {
140
+ var restart = true
141
+ self . timers. performAtomic ( atomicOperation: { ( timers) in
142
+ if !timers. contains ( where: { $0. key == sdkKey} ) {
143
+ restart = false
144
+ }
145
+ } )
146
+
147
+ return restart
148
+ }
149
+
137
150
func stopPeriodicUpdates( sdkKey: String ) {
138
151
timers. performAtomic { ( timers) in
139
152
if let timer = timers [ sdkKey] {
0 commit comments