Skip to content
This repository was archived by the owner on Feb 27, 2022. It is now read-only.

Commit 1d96a4b

Browse files
authored
Merge pull request #43 from plukkido/bug/invalidsession
Attempting to solve #35: Synchronization problem causing EXC_BAD_ACCESS and inserting nil into Dictionary during serialization
2 parents ccc4491 + c88beed commit 1d96a4b

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

ios/RNBackgroundDownloader.m

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,10 @@ - (void)removeTaskFromMap: (NSURLSessionTask *)task {
8484
NSNumber *taskId = @(task.taskIdentifier);
8585
RNBGDTaskConfig *taskConfig = taskToConfigMap[taskId];
8686
[taskToConfigMap removeObjectForKey:taskId];
87-
[urlToConfigMap removeObjectForKey:task.currentRequest.URL.absoluteString];
88-
[[NSUserDefaults standardUserDefaults] setObject:[self serialize: urlToConfigMap] forKey:URL_TO_CONFIG_MAP_KEY];
87+
@synchronized (urlToConfigMap) {
88+
[urlToConfigMap removeObjectForKey:task.currentRequest.URL.absoluteString];
89+
[[NSUserDefaults standardUserDefaults] setObject:[self serialize: urlToConfigMap] forKey:URL_TO_CONFIG_MAP_KEY];
90+
}
8991
if (taskConfig) {
9092
[idToTaskMap removeObjectForKey:taskConfig.id];
9193
[idToPercentMap removeObjectForKey:taskConfig.id];
@@ -216,29 +218,31 @@ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTas
216218
}
217219

218220
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
219-
RNBGDTaskConfig *taskCofig = taskToConfigMap[@(downloadTask.taskIdentifier)];
220-
if (taskCofig != nil) {
221-
if (!taskCofig.reportedBegin) {
222-
[self sendEventWithName:@"downloadBegin" body:@{@"id": taskCofig.id, @"expectedBytes": [NSNumber numberWithLongLong: totalBytesExpectedToWrite]}];
223-
urlToConfigMap[downloadTask.currentRequest.URL.absoluteString] = taskCofig;
224-
[[NSUserDefaults standardUserDefaults] setObject:[self serialize: urlToConfigMap] forKey:URL_TO_CONFIG_MAP_KEY];
225-
taskCofig.reportedBegin = YES;
226-
}
227-
228-
NSNumber *prevPercent = idToPercentMap[taskCofig.id];
229-
NSNumber *percent = [NSNumber numberWithFloat:(float)totalBytesWritten/(float)totalBytesExpectedToWrite];
230-
if ([percent floatValue] - [prevPercent floatValue] > 0.01f) {
231-
progressReports[taskCofig.id] = @{@"id": taskCofig.id, @"written": [NSNumber numberWithLongLong: totalBytesWritten], @"total": [NSNumber numberWithLongLong: totalBytesExpectedToWrite], @"percent": percent};
232-
idToPercentMap[taskCofig.id] = percent;
233-
}
234-
235-
NSDate *now = [[NSDate alloc] init];
236-
if ([now timeIntervalSinceDate:lastProgressReport] > 1.5 && progressReports.count > 0) {
237-
if (self.bridge) {
238-
[self sendEventWithName:@"downloadProgress" body:[progressReports allValues]];
221+
@synchronized (self) {
222+
RNBGDTaskConfig *taskCofig = taskToConfigMap[@(downloadTask.taskIdentifier)];
223+
if (taskCofig != nil) {
224+
if (!taskCofig.reportedBegin) {
225+
[self sendEventWithName:@"downloadBegin" body:@{@"id": taskCofig.id, @"expectedBytes": [NSNumber numberWithLongLong: totalBytesExpectedToWrite]}];
226+
urlToConfigMap[downloadTask.currentRequest.URL.absoluteString] = taskCofig;
227+
[[NSUserDefaults standardUserDefaults] setObject:[self serialize: urlToConfigMap] forKey:URL_TO_CONFIG_MAP_KEY];
228+
taskCofig.reportedBegin = YES;
229+
}
230+
231+
NSNumber *prevPercent = idToPercentMap[taskCofig.id];
232+
NSNumber *percent = [NSNumber numberWithFloat:(float)totalBytesWritten/(float)totalBytesExpectedToWrite];
233+
if ([percent floatValue] - [prevPercent floatValue] > 0.01f) {
234+
progressReports[taskCofig.id] = @{@"id": taskCofig.id, @"written": [NSNumber numberWithLongLong: totalBytesWritten], @"total": [NSNumber numberWithLongLong: totalBytesExpectedToWrite], @"percent": percent};
235+
idToPercentMap[taskCofig.id] = percent;
236+
}
237+
238+
NSDate *now = [[NSDate alloc] init];
239+
if ([now timeIntervalSinceDate:lastProgressReport] > 1.5 && progressReports.count > 0) {
240+
if (self.bridge) {
241+
[self sendEventWithName:@"downloadProgress" body:[progressReports allValues]];
242+
}
243+
lastProgressReport = now;
244+
[progressReports removeAllObjects];
239245
}
240-
lastProgressReport = now;
241-
[progressReports removeAllObjects];
242246
}
243247
}
244248
}

0 commit comments

Comments
 (0)