@@ -105,29 +105,35 @@ @implementation RNFetchBlobNetwork
105
105
// constructor
106
106
- (id )init {
107
107
self = [super init ];
108
- if (taskQueue == nil ) {
109
- taskQueue = [[NSOperationQueue alloc ] init ];
110
- taskQueue.maxConcurrentOperationCount = 10 ;
108
+ @synchronized ([RNFetchBlobNetwork class ]) {
109
+ if (taskQueue == nil ) {
110
+ taskQueue = [[NSOperationQueue alloc ] init ];
111
+ taskQueue.maxConcurrentOperationCount = 10 ;
112
+ }
111
113
}
112
114
return self;
113
115
}
114
116
115
117
+ (void ) enableProgressReport : (NSString *) taskId config : (RNFetchBlobProgress *)config
116
118
{
117
- if (progressTable == nil )
118
- {
119
- progressTable = [[NSMutableDictionary alloc ] init ];
119
+ @synchronized ([RNFetchBlobNetwork class ]) {
120
+ if (progressTable == nil )
121
+ {
122
+ progressTable = [[NSMutableDictionary alloc ] init ];
123
+ }
124
+ [progressTable setValue: config forKey: taskId];
120
125
}
121
- [progressTable setValue: config forKey: taskId];
122
126
}
123
127
124
128
+ (void ) enableUploadProgress : (NSString *) taskId config : (RNFetchBlobProgress *)config
125
129
{
126
- if (uploadProgressTable == nil )
127
- {
128
- uploadProgressTable = [[NSMutableDictionary alloc ] init ];
130
+ @synchronized ([RNFetchBlobNetwork class ]) {
131
+ if (uploadProgressTable == nil )
132
+ {
133
+ uploadProgressTable = [[NSMutableDictionary alloc ] init ];
134
+ }
135
+ [uploadProgressTable setValue: config forKey: taskId];
129
136
}
130
- [uploadProgressTable setValue: config forKey: taskId];
131
137
}
132
138
133
139
// removing case from headers
@@ -241,8 +247,10 @@ - (void) sendRequest:(__weak NSDictionary * _Nullable )options
241
247
}
242
248
243
249
__block NSURLSessionDataTask * task = [session dataTaskWithRequest: req];
244
- [taskTable setObject: task forKey: taskId];
245
- [task resume ];
250
+ @synchronized ([RNFetchBlobNetwork class ]){
251
+ [taskTable setObject: task forKey: taskId];
252
+ [task resume ];
253
+ }
246
254
247
255
// network status indicator
248
256
if ([[options objectForKey: CONFIG_INDICATOR] boolValue ] == YES )
@@ -254,21 +262,22 @@ - (void) sendRequest:(__weak NSDictionary * _Nullable )options
254
262
// #115 Invoke fetch.expire event on those expired requests so that the expired event can be handled
255
263
+ (void ) emitExpiredTasks
256
264
{
257
- NSEnumerator * emu = [expirationTable keyEnumerator ];
258
- NSString * key;
259
-
260
- while ((key = [emu nextObject ]))
261
- {
262
- RCTBridge * bridge = [RNFetchBlob getRCTBridge ];
263
- NSData * args = @{ @" taskId" : key };
264
- [bridge.eventDispatcher sendDeviceEventWithName: EVENT_EXPIRE body: args];
265
+ @synchronized ([RNFetchBlobNetwork class ]){
266
+ NSEnumerator * emu = [expirationTable keyEnumerator ];
267
+ NSString * key;
265
268
266
- }
269
+ while ((key = [emu nextObject ]))
270
+ {
271
+ RCTBridge * bridge = [RNFetchBlob getRCTBridge ];
272
+ NSData * args = @{ @" taskId" : key };
273
+ [bridge.eventDispatcher sendDeviceEventWithName: EVENT_EXPIRE body: args];
267
274
268
- // clear expired task entries
269
- [expirationTable removeAllObjects ];
270
- expirationTable = [[NSMapTable alloc ] init ];
275
+ }
271
276
277
+ // clear expired task entries
278
+ [expirationTable removeAllObjects ];
279
+ expirationTable = [[NSMapTable alloc ] init ];
280
+ }
272
281
}
273
282
274
283
// //////////////////////////////////////
@@ -448,10 +457,18 @@ - (void) URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dat
448
457
{
449
458
[writeStream write: [data bytes ] maxLength: [data length ]];
450
459
}
451
- RNFetchBlobProgress * pconfig = [progressTable valueForKey: taskId];
460
+
452
461
if (expectedBytes == 0 )
453
462
return ;
463
+
464
+ RNFetchBlobProgress * pconfig;
465
+
466
+ @synchronized ([RNFetchBlobNetwork class ]){
467
+ pconfig = [progressTable valueForKey: taskId];
468
+ }
469
+
454
470
NSNumber * now =[NSNumber numberWithFloat: ((float )receivedBytes/(float )expectedBytes)];
471
+
455
472
if (pconfig != nil && [pconfig shouldReport: now])
456
473
{
457
474
[self .bridge.eventDispatcher
@@ -461,11 +478,9 @@ - (void) URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dat
461
478
@" written" : [NSString stringWithFormat: @" %d " , receivedBytes],
462
479
@" total" : [NSString stringWithFormat: @" %d " , expectedBytes],
463
480
@" chunk" : chunkString
464
- }
481
+ }
465
482
];
466
483
}
467
- received = nil ;
468
-
469
484
}
470
485
471
486
- (void ) URLSession : (NSURLSession *)session didBecomeInvalidWithError : (nullable NSError *)error
@@ -537,7 +552,7 @@ - (void) URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCom
537
552
538
553
callback (@[ errMsg, rnfbRespType, respStr]);
539
554
540
- @synchronized (taskTable, uploadProgressTable, progressTable )
555
+ @synchronized ([RNFetchBlobNetwork class ] )
541
556
{
542
557
if ([taskTable objectForKey: taskId] == nil )
543
558
NSLog (@" object released by ARC." );
@@ -556,25 +571,36 @@ - (void) URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCom
556
571
// upload progress handler
557
572
- (void ) URLSession : (NSURLSession *)session task : (NSURLSessionTask *)task didSendBodyData : (int64_t )bytesSent totalBytesSent : (int64_t )totalBytesWritten totalBytesExpectedToSend : (int64_t )totalBytesExpectedToWrite
558
573
{
559
- RNFetchBlobProgress * pconfig = [uploadProgressTable valueForKey: taskId];
560
574
if (totalBytesExpectedToWrite == 0 )
561
575
return ;
576
+
577
+ RNFetchBlobProgress * pconfig;
578
+
579
+ @synchronized ([RNFetchBlobNetwork class ]) {
580
+ pconfig = [uploadProgressTable valueForKey: taskId];
581
+ }
582
+
562
583
NSNumber * now = [NSNumber numberWithFloat: ((float )totalBytesWritten/(float )totalBytesExpectedToWrite)];
563
584
if (pconfig != nil && [pconfig shouldReport: now]) {
564
585
[self .bridge.eventDispatcher
565
586
sendDeviceEventWithName: EVENT_PROGRESS_UPLOAD
566
587
body: @{
567
588
@" taskId" : taskId,
568
- @" written" : [NSString stringWithFormat: @" %d " , totalBytesWritten],
569
- @" total" : [NSString stringWithFormat: @" %d " , totalBytesExpectedToWrite]
589
+ @" written" : [NSString stringWithFormat: @" %ld " , ( long ) totalBytesWritten],
590
+ @" total" : [NSString stringWithFormat: @" %ld " , ( long ) totalBytesExpectedToWrite]
570
591
}
571
592
];
572
593
}
573
594
}
574
595
575
596
+ (void ) cancelRequest : (NSString *)taskId
576
597
{
577
- NSURLSessionDataTask * task = [taskTable objectForKey: taskId];
598
+ NSURLSessionDataTask * task;
599
+
600
+ @synchronized ([RNFetchBlobNetwork class ]) {
601
+ task = [taskTable objectForKey: taskId];
602
+ }
603
+
578
604
if (task != nil && task.state == NSURLSessionTaskStateRunning )
579
605
[task cancel ];
580
606
}
0 commit comments