Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Example/Storage/Tests/Unit/FIRStoragePathTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,10 @@ - (void)testchildToRoot {

- (void)testChildByAppendingNilToRoot {
FIRStoragePath *path = [[FIRStoragePath alloc] initWithBucket:@"bucket" object:nil];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull"
FIRStoragePath *childPath = [path child:nil];
#pragma clang diagnostic pop
XCTAssertEqualObjects([childPath stringValue], @"gs://bucket/");
}

Expand Down
21 changes: 11 additions & 10 deletions Firebase/Storage/FIRStorageDeleteTask.m
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,21 @@ - (void)enqueue {

fetcher.comment = @"DeleteTask";

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
__weak FIRStorageDeleteTask *weakSelf = self;
_fetcherCompletion = ^(NSData *_Nullable data, NSError *_Nullable error) {
if (!self.error) {
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
}
if (callback) {
callback(self.error);
__strong FIRStorageDeleteTask *strongSelf = weakSelf;
if (strongSelf) {
if (!strongSelf.error) {
strongSelf.error =
[FIRStorageErrors errorWithServerError:error reference:strongSelf.reference];
}
if (callback) {
callback(strongSelf.error);
}
strongSelf->_fetcherCompletion = nil;
}
self->_fetcherCompletion = nil;
};
#pragma clang diangostic pop

__weak FIRStorageDeleteTask *weakSelf = self;
[fetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) {
weakSelf.fetcherCompletion(data, error);
}];
Expand Down
54 changes: 29 additions & 25 deletions Firebase/Storage/FIRStorageDownloadTask.m
Original file line number Diff line number Diff line change
Expand Up @@ -104,41 +104,45 @@ - (void)enqueueWithData:(nullable NSData *)resumeData {

_fetcher = fetcher;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
_fetcherCompletion = ^(NSData *data, NSError *error) {
// Fire last progress updates
[self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot];

// Handle potential issues with download
if (error) {
self.state = FIRStorageTaskStateFailed;
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
[self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot];
[self removeAllObservers];
self->_fetcherCompletion = nil;
return;
__strong FIRStorageDownloadTask *strongSelf = weakSelf;
if (strongSelf) {
[strongSelf onFetchCompletionWithData:data error:error];
}

// Download completed successfully, fire completion callbacks
self.state = FIRStorageTaskStateSuccess;

if (data) {
self->_downloadData = data;
}

[self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot];
[self removeAllObservers];
self->_fetcherCompletion = nil;
};
#pragma clang diagnostic pop

self.state = FIRStorageTaskStateRunning;
[self.fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
weakSelf.fetcherCompletion(data, error);
}];
}

- (void)onFetchCompletionWithData:(NSData *)data error:(NSError *)error {
// Fire last progress updates
[self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot];

// Handle potential issues with download
if (error) {
self.state = FIRStorageTaskStateFailed;
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
[self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot];
[self removeAllObservers];
self->_fetcherCompletion = nil;
return;
}

// Download completed successfully, fire completion callbacks
self.state = FIRStorageTaskStateSuccess;

if (data) {
self->_downloadData = data;
}

[self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot];
[self removeAllObservers];
self->_fetcherCompletion = nil;
}

#pragma mark - Download Management

- (void)cancel {
Expand Down
47 changes: 24 additions & 23 deletions Firebase/Storage/FIRStorageGetDownloadURLTask.m
Original file line number Diff line number Diff line change
Expand Up @@ -78,37 +78,38 @@ - (void)enqueue {
_fetcher = fetcher;
fetcher.comment = @"GetDownloadURLTask";

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
__weak FIRStorageGetDownloadURLTask *weakSelf = self;
_fetcherCompletion = ^(NSData *data, NSError *error) {
NSURL *downloadURL;
if (error) {
if (!self.error) {
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
}
} else {
NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data];
if (responseDictionary != nil) {
downloadURL =
[FIRStorageGetDownloadURLTask downloadURLFromMetadataDictionary:responseDictionary];
if (!downloadURL) {
self.error =
[FIRStorageErrors errorWithCustomMessage:@"Failed to retrieve a download URL."];
__strong FIRStorageGetDownloadURLTask *strongSelf = weakSelf;
if (strongSelf) {
NSURL *downloadURL;
if (error) {
if (!strongSelf.error) {
strongSelf.error =
[FIRStorageErrors errorWithServerError:error reference:strongSelf.reference];
}
} else {
self.error = [FIRStorageErrors errorWithInvalidRequest:data];
NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data];
if (responseDictionary != nil) {
downloadURL =
[FIRStorageGetDownloadURLTask downloadURLFromMetadataDictionary:responseDictionary];
if (!downloadURL) {
strongSelf.error =
[FIRStorageErrors errorWithCustomMessage:@"Failed to retrieve a download URL."];
}
} else {
strongSelf.error = [FIRStorageErrors errorWithInvalidRequest:data];
}
}
}

if (callback) {
callback(downloadURL, self.error);
}
if (callback) {
callback(downloadURL, strongSelf.error);
}

self->_fetcherCompletion = nil;
strongSelf->_fetcherCompletion = nil;
}
};
#pragma clang diagnostic pop

__weak FIRStorageGetDownloadURLTask *weakSelf = self;
[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
weakSelf.fetcherCompletion(data, error);
}];
Expand Down
39 changes: 20 additions & 19 deletions Firebase/Storage/FIRStorageGetMetadataTask.m
Original file line number Diff line number Diff line change
Expand Up @@ -55,32 +55,33 @@ - (void)enqueue {
_fetcher = fetcher;
fetcher.comment = @"GetMetadataTask";

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
__weak FIRStorageGetMetadataTask *weakSelf = self;
_fetcherCompletion = ^(NSData *data, NSError *error) {
FIRStorageMetadata *metadata;
if (error) {
if (!self.error) {
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
}
} else {
NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data];
if (responseDictionary != nil) {
metadata = [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary];
[metadata setType:FIRStorageMetadataTypeFile];
__strong FIRStorageGetMetadataTask *strongSelf = weakSelf;
if (strongSelf) {
FIRStorageMetadata *metadata = nil;
if (error) {
if (!strongSelf.error) {
strongSelf.error =
[FIRStorageErrors errorWithServerError:error reference:strongSelf.reference];
}
} else {
self.error = [FIRStorageErrors errorWithInvalidRequest:data];
NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data];
if (responseDictionary != nil) {
metadata = [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary];
[metadata setType:FIRStorageMetadataTypeFile];
} else {
strongSelf.error = [FIRStorageErrors errorWithInvalidRequest:data];
}
}
}

if (callback) {
callback(metadata, self.error);
if (callback) {
callback(metadata, strongSelf.error);
}
strongSelf->_fetcherCompletion = nil;
}
self->_fetcherCompletion = nil;
};
#pragma clang diagnostic pop

__weak FIRStorageGetMetadataTask *weakSelf = self;
[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
weakSelf.fetcherCompletion(data, error);
}];
Expand Down
39 changes: 20 additions & 19 deletions Firebase/Storage/FIRStorageUpdateMetadataTask.m
Original file line number Diff line number Diff line change
Expand Up @@ -61,34 +61,35 @@ - (void)enqueue {
GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request];
_fetcher = fetcher;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
__weak FIRStorageUpdateMetadataTask *weakSelf = self;
_fetcherCompletion = ^(NSData *data, NSError *error) {
FIRStorageMetadata *metadata;
if (error) {
if (!self.error) {
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
}
} else {
NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data];
if (responseDictionary) {
metadata = [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary];
[metadata setType:FIRStorageMetadataTypeFile];
__strong FIRStorageUpdateMetadataTask *strongSelf = weakSelf;
if (strongSelf) {
FIRStorageMetadata *metadata;
if (error) {
if (!strongSelf.error) {
strongSelf.error =
[FIRStorageErrors errorWithServerError:error reference:strongSelf.reference];
}
} else {
self.error = [FIRStorageErrors errorWithInvalidRequest:data];
NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data];
if (responseDictionary) {
metadata = [[FIRStorageMetadata alloc] initWithDictionary:responseDictionary];
[metadata setType:FIRStorageMetadataTypeFile];
} else {
strongSelf.error = [FIRStorageErrors errorWithInvalidRequest:data];
}
}
}

if (callback) {
callback(metadata, self.error);
if (callback) {
callback(metadata, strongSelf.error);
}
strongSelf->_fetcherCompletion = nil;
}
self->_fetcherCompletion = nil;
};
#pragma clang diagnostic pop

fetcher.comment = @"UpdateMetadataTask";

__weak FIRStorageUpdateMetadataTask *weakSelf = self;
[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
weakSelf.fetcherCompletion(data, error);
}];
Expand Down
72 changes: 36 additions & 36 deletions Firebase/Storage/FIRStorageUploadTask.m
Original file line number Diff line number Diff line change
Expand Up @@ -127,46 +127,46 @@ - (void)enqueue {
// Process fetches
self.state = FIRStorageTaskStateRunning;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
_fetcherCompletion = ^(NSData *_Nullable data, NSError *_Nullable error) {
// Fire last progress updates
[self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot];

// Handle potential issues with upload
if (error) {
self.state = FIRStorageTaskStateFailed;
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
self.metadata = self->_uploadMetadata;
[self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot];
[self removeAllObservers];
self->_fetcherCompletion = nil;
return;
__strong FIRStorageUploadTask *strongSelf = weakSelf;
if (strongSelf) {
// Fire last progress updates
[strongSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:strongSelf.snapshot];

// Handle potential issues with upload
if (error) {
strongSelf.state = FIRStorageTaskStateFailed;
strongSelf.error =
[FIRStorageErrors errorWithServerError:error reference:strongSelf.reference];
strongSelf.metadata = strongSelf->_uploadMetadata;
[strongSelf fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:strongSelf.snapshot];
[strongSelf removeAllObservers];
strongSelf->_fetcherCompletion = nil;
return;
}

// Upload completed successfully, fire completion callbacks
strongSelf.state = FIRStorageTaskStateSuccess;

NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data];
if (responseDictionary) {
FIRStorageMetadata *metadata =
[[FIRStorageMetadata alloc] initWithDictionary:responseDictionary];
[metadata setType:FIRStorageMetadataTypeFile];
strongSelf.metadata = metadata;
} else {
strongSelf.error = [FIRStorageErrors errorWithInvalidRequest:data];
}

[strongSelf fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:strongSelf.snapshot];
[strongSelf removeAllObservers];
strongSelf->_fetcherCompletion = nil;
}

// Upload completed successfully, fire completion callbacks
self.state = FIRStorageTaskStateSuccess;

NSDictionary *responseDictionary = [NSDictionary frs_dictionaryFromJSONData:data];
if (responseDictionary) {
FIRStorageMetadata *metadata =
[[FIRStorageMetadata alloc] initWithDictionary:responseDictionary];
[metadata setType:FIRStorageMetadataTypeFile];
self.metadata = metadata;
} else {
self.error = [FIRStorageErrors errorWithInvalidRequest:data];
}

[self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot];
[self removeAllObservers];
self->_fetcherCompletion = nil;
};
#pragma clang diagnostic pop

[_uploadFetcher
beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) {
weakSelf.fetcherCompletion(data, error);
}];
[_uploadFetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
weakSelf.fetcherCompletion(data, error);
}];
}

#pragma mark - Upload Management
Expand Down
2 changes: 1 addition & 1 deletion Firebase/Storage/Private/FIRStorageTask_Private.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ NS_ASSUME_NONNULL_BEGIN

@property(readonly, nonatomic) GTMSessionFetcherService *fetcherService;

@property(readonly) GTMSessionFetcherCompletionHandler fetcherCompletion;
@property(readonly, copy) GTMSessionFetcherCompletionHandler fetcherCompletion;

/**
* Creates a new FIRStorageTask initialized with a FIRStorageReference and GTMSessionFetcherService.
Expand Down