Skip to content

Commit d6f3f8d

Browse files
authored
Only fail a StorageTask once (#5245)
1 parent 6a2de7e commit d6f3f8d

File tree

2 files changed

+41
-8
lines changed

2 files changed

+41
-8
lines changed

FirebaseStorage/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# Unreleased
2+
- [fixed] Fix a rare case where a StorageTask would call its completion callbacks more than
3+
once. (#5245)
4+
15
# 3.6.0
26
- [added] Added watchOS support for Firebase Storage. (#4955)
37

FirebaseStorage/Sources/FIRStorageReference.m

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ - (FIRStorageUploadTask *)putData:(NSData *)uploadData
174174
metadata:metadata];
175175

176176
if (completion) {
177+
__block BOOL completed = NO;
177178
dispatch_queue_t callbackQueue = _storage.fetcherServiceForApp.callbackQueue;
178179
if (!callbackQueue) {
179180
callbackQueue = dispatch_get_main_queue();
@@ -182,13 +183,19 @@ - (FIRStorageUploadTask *)putData:(NSData *)uploadData
182183
[task observeStatus:FIRStorageTaskStatusSuccess
183184
handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) {
184185
dispatch_async(callbackQueue, ^{
185-
completion(snapshot.metadata, nil);
186+
if (!completed) {
187+
completed = YES;
188+
completion(snapshot.metadata, nil);
189+
}
186190
});
187191
}];
188192
[task observeStatus:FIRStorageTaskStatusFailure
189193
handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) {
190194
dispatch_async(callbackQueue, ^{
191-
completion(nil, snapshot.error);
195+
if (!completed) {
196+
completed = YES;
197+
completion(nil, snapshot.error);
198+
}
192199
});
193200
}];
194201
}
@@ -222,6 +229,7 @@ - (FIRStorageUploadTask *)putFile:(NSURL *)fileURL
222229
metadata:metadata];
223230

224231
if (completion) {
232+
__block BOOL completed = NO;
225233
dispatch_queue_t callbackQueue = _storage.fetcherServiceForApp.callbackQueue;
226234
if (!callbackQueue) {
227235
callbackQueue = dispatch_get_main_queue();
@@ -230,13 +238,19 @@ - (FIRStorageUploadTask *)putFile:(NSURL *)fileURL
230238
[task observeStatus:FIRStorageTaskStatusSuccess
231239
handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) {
232240
dispatch_async(callbackQueue, ^{
233-
completion(snapshot.metadata, nil);
241+
if (!completed) {
242+
completed = YES;
243+
completion(snapshot.metadata, nil);
244+
}
234245
});
235246
}];
236247
[task observeStatus:FIRStorageTaskStatusFailure
237248
handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) {
238249
dispatch_async(callbackQueue, ^{
239-
completion(nil, snapshot.error);
250+
if (!completed) {
251+
completed = YES;
252+
completion(nil, snapshot.error);
253+
}
240254
});
241255
}];
242256
}
@@ -248,6 +262,7 @@ - (FIRStorageUploadTask *)putFile:(NSURL *)fileURL
248262

249263
- (FIRStorageDownloadTask *)dataWithMaxSize:(int64_t)size
250264
completion:(FIRStorageVoidDataError)completion {
265+
__block BOOL completed = NO;
251266
FIRStorageDownloadTask *task =
252267
[[FIRStorageDownloadTask alloc] initWithReference:self
253268
fetcherService:_storage.fetcherServiceForApp
@@ -263,13 +278,20 @@ - (FIRStorageDownloadTask *)dataWithMaxSize:(int64_t)size
263278
handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) {
264279
FIRStorageDownloadTask *task = snapshot.task;
265280
dispatch_async(callbackQueue, ^{
266-
completion(task.downloadData, nil);
281+
if (!completed) {
282+
completed = YES;
283+
completion(task.downloadData, nil);
284+
}
267285
});
268286
}];
287+
269288
[task observeStatus:FIRStorageTaskStatusFailure
270289
handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) {
271290
dispatch_async(callbackQueue, ^{
272-
completion(nil, snapshot.error);
291+
if (!completed) {
292+
completed = YES;
293+
completion(nil, snapshot.error);
294+
}
273295
});
274296
}];
275297
[task
@@ -302,6 +324,7 @@ - (FIRStorageDownloadTask *)writeToFile:(NSURL *)fileURL
302324
dispatchQueue:_storage.dispatchQueue
303325
file:fileURL];
304326
if (completion) {
327+
__block BOOL completed = NO;
305328
dispatch_queue_t callbackQueue = _storage.fetcherServiceForApp.callbackQueue;
306329
if (!callbackQueue) {
307330
callbackQueue = dispatch_get_main_queue();
@@ -310,13 +333,19 @@ - (FIRStorageDownloadTask *)writeToFile:(NSURL *)fileURL
310333
[task observeStatus:FIRStorageTaskStatusSuccess
311334
handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) {
312335
dispatch_async(callbackQueue, ^{
313-
completion(fileURL, nil);
336+
if (!completed) {
337+
completed = YES;
338+
completion(fileURL, nil);
339+
}
314340
});
315341
}];
316342
[task observeStatus:FIRStorageTaskStatusFailure
317343
handler:^(FIRStorageTaskSnapshot *_Nonnull snapshot) {
318344
dispatch_async(callbackQueue, ^{
319-
completion(nil, snapshot.error);
345+
if (!completed) {
346+
completed = YES;
347+
completion(nil, snapshot.error);
348+
}
320349
});
321350
}];
322351
}

0 commit comments

Comments
 (0)