From 5cb9446fab0606b0ea6a49dcda50fb6bb6e5bbd4 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Thu, 15 Jun 2017 09:43:31 -0700 Subject: Calling stopFetching on GTMSessionFetcher to stop callbacks from bein… (#81) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Calling stopFetching on GTMSeesionFetcher to stop callbacks from being called after deallocation. Also fixing retain cycles in all task classes. * Addressing build warnings * Adjusting indentation --- Firebase/Storage/FIRStorageDeleteTask.m | 21 +++++++++- Firebase/Storage/FIRStorageDownloadTask.m | 49 +++++++++++++++-------- Firebase/Storage/FIRStorageGetMetadataTask.m | 21 +++++++++- Firebase/Storage/FIRStorageUpdateMetadataTask.m | 24 ++++++++++- Firebase/Storage/FIRStorageUploadTask.m | 34 ++++++++++++---- Firebase/Storage/Private/FIRStorageTask_Private.h | 2 + 6 files changed, 123 insertions(+), 28 deletions(-) (limited to 'Firebase/Storage') diff --git a/Firebase/Storage/FIRStorageDeleteTask.m b/Firebase/Storage/FIRStorageDeleteTask.m index 4f3f1cc..63254c7 100644 --- a/Firebase/Storage/FIRStorageDeleteTask.m +++ b/Firebase/Storage/FIRStorageDeleteTask.m @@ -21,6 +21,13 @@ FIRStorageVoidError _completion; } +@synthesize fetcher = _fetcher; +@synthesize fetcherCompletion = _fetcherCompletion; + +- (void) dealloc { + [_fetcher stopFetching]; +} + - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service completion:(FIRStorageVoidError)completion { @@ -40,14 +47,26 @@ _completion = nil; GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request]; + _fetcher = fetcher; + fetcher.comment = @"DeleteTask"; - [fetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" + _fetcherCompletion = ^(NSData *_Nullable data, NSError *_Nullable error) { if (!self.error) { self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; } if (callback) { callback(self.error); } + _fetcherCompletion = nil; + }; +#pragma clang diangostic pop + + __weak FIRStorageDeleteTask* weakSelf = self; + [fetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) { + weakSelf.fetcherCompletion(data, error); }]; } diff --git a/Firebase/Storage/FIRStorageDownloadTask.m b/Firebase/Storage/FIRStorageDownloadTask.m index 0d71e52..783ac68 100644 --- a/Firebase/Storage/FIRStorageDownloadTask.m +++ b/Firebase/Storage/FIRStorageDownloadTask.m @@ -23,6 +23,7 @@ @synthesize progress = _progress; @synthesize fetcher = _fetcher; +@synthesize fetcherCompletion = _fetcherCompletion; - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service @@ -35,6 +36,10 @@ return self; } +- (void) dealloc { + [_fetcher stopFetching]; +} + - (void)enqueue { [self enqueueWithData:nil]; } @@ -60,9 +65,12 @@ fetcher.comment = @"Starting DownloadTask"; } + __weak FIRStorageDownloadTask *weakSelf = self; + [fetcher setResumeDataBlock:^(NSData *data) { if (data) { - _downloadData = data; + FIRStorageDownloadTask *strongSelf = weakSelf; + strongSelf->_downloadData = data; } }]; @@ -73,30 +81,31 @@ [fetcher setDestinationFileURL:_fileURL]; [fetcher setDownloadProgressBlock:^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) { - self.state = FIRStorageTaskStateProgress; - self.progress.completedUnitCount = totalBytesWritten; - self.progress.totalUnitCount = totalBytesExpectedToWrite; - FIRStorageTaskSnapshot *snapshot = self.snapshot; - [self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot]; - self.state = FIRStorageTaskStateRunning; + weakSelf.state = FIRStorageTaskStateProgress; + weakSelf.progress.completedUnitCount = totalBytesWritten; + weakSelf.progress.totalUnitCount = totalBytesExpectedToWrite; + FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; }]; } else { // Handle data downloads [fetcher setReceivedProgressBlock:^(int64_t bytesWritten, int64_t totalBytesWritten) { - self.state = FIRStorageTaskStateProgress; - self.progress.completedUnitCount = totalBytesWritten; - int64_t totalLength = [[self.fetcher response] expectedContentLength]; - self.progress.totalUnitCount = totalLength; - FIRStorageTaskSnapshot *snapshot = self.snapshot; - [self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot]; - self.state = FIRStorageTaskStateRunning; + weakSelf.state = FIRStorageTaskStateProgress; + weakSelf.progress.completedUnitCount = totalBytesWritten; + int64_t totalLength = [[weakSelf.fetcher response] expectedContentLength]; + weakSelf.progress.totalUnitCount = totalLength; + FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; }]; } _fetcher = fetcher; - self.state = FIRStorageTaskStateRunning; - [self.fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { +#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]; @@ -106,6 +115,7 @@ self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; [self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot]; [self removeAllObservers]; + _fetcherCompletion = nil; return; } @@ -118,6 +128,13 @@ [self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot]; [self removeAllObservers]; + _fetcherCompletion = nil; + }; +#pragma clang diagnostic pop + + self.state = FIRStorageTaskStateRunning; + [self.fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); }]; } diff --git a/Firebase/Storage/FIRStorageGetMetadataTask.m b/Firebase/Storage/FIRStorageGetMetadataTask.m index d0e8981..c7be8cc 100644 --- a/Firebase/Storage/FIRStorageGetMetadataTask.m +++ b/Firebase/Storage/FIRStorageGetMetadataTask.m @@ -26,6 +26,9 @@ FIRStorageVoidMetadataError _completion; } +@synthesize fetcher = _fetcher; +@synthesize fetcherCompletion = _fetcherCompletion; + - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service completion:(FIRStorageVoidMetadataError)completion { @@ -36,6 +39,10 @@ return self; } +- (void) dealloc { + [_fetcher stopFetching]; +} + - (void)enqueue { NSMutableURLRequest *request = [self.baseRequest mutableCopy]; request.HTTPMethod = @"GET"; @@ -45,8 +52,12 @@ _completion = nil; GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request]; + _fetcher = fetcher; fetcher.comment = @"GetMetadataTask"; - [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" + _fetcherCompletion = ^(NSData *data, NSError *error) { if (error) { if (!self.error) { self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; @@ -54,6 +65,7 @@ if (callback) { callback(nil, self.error); } + _fetcherCompletion = nil; return; } @@ -78,6 +90,13 @@ callback(nil, self.error); } } + _fetcherCompletion = nil; + }; +#pragma clang diagnostic pop + + __weak FIRStorageGetMetadataTask *weakSelf = self; + [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); }]; } diff --git a/Firebase/Storage/FIRStorageUpdateMetadataTask.m b/Firebase/Storage/FIRStorageUpdateMetadataTask.m index dbd276b..5f019f4 100644 --- a/Firebase/Storage/FIRStorageUpdateMetadataTask.m +++ b/Firebase/Storage/FIRStorageUpdateMetadataTask.m @@ -24,6 +24,9 @@ FIRStorageMetadata *_updateMetadata; } +@synthesize fetcher = _fetcher; +@synthesize fetcherCompletion = _fetcherCompletion; + - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service metadata:(FIRStorageMetadata *)metadata @@ -36,6 +39,10 @@ return self; } +- (void) dealloc { + [_fetcher stopFetching]; +} + - (void)enqueue { NSMutableURLRequest *request = [self.baseRequest mutableCopy]; NSDictionary *updateDictionary = [_updateMetadata dictionaryRepresentation]; @@ -52,8 +59,11 @@ _completion = nil; GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request]; - fetcher.comment = @"UpdateMetadataTask"; - [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + _fetcher = fetcher; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" + _fetcherCompletion =^(NSData *data, NSError *error) { if (error) { if (!self.error) { self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference]; @@ -61,6 +71,7 @@ if (callback) { callback(nil, self.error); } + _fetcherCompletion = nil; return; } @@ -85,6 +96,15 @@ callback(nil, self.error); } } + _fetcherCompletion = nil; + }; +#pragma clang diagnostic pop + + fetcher.comment = @"UpdateMetadataTask"; + + __weak FIRStorageUpdateMetadataTask *weakSelf = self; + [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + weakSelf.fetcherCompletion(data, error); }]; } diff --git a/Firebase/Storage/FIRStorageUploadTask.m b/Firebase/Storage/FIRStorageUploadTask.m index 74741b0..f9f6275 100644 --- a/Firebase/Storage/FIRStorageUploadTask.m +++ b/Firebase/Storage/FIRStorageUploadTask.m @@ -25,6 +25,7 @@ @implementation FIRStorageUploadTask @synthesize progress = _progress; +@synthesize fetcherCompletion = _fetcherCompletion; - (instancetype)initWithReference:(FIRStorageReference *)reference fetcherService:(GTMSessionFetcherService *)service @@ -62,6 +63,10 @@ return self; } +- (void) dealloc { + [_uploadFetcher stopFetching]; +} + - (void)enqueue { NSAssert([NSThread isMainThread], @"Upload attempting to execute on non main queue! Please only " @"execute this method on the main queue."); @@ -103,23 +108,28 @@ } uploadFetcher.maxRetryInterval = self.reference.storage.maxUploadRetryTime; + + __weak FIRStorageUploadTask* weakSelf = self; [uploadFetcher setSendProgressBlock:^(int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) { - self.state = FIRStorageTaskStateProgress; - self.progress.completedUnitCount = totalBytesSent; - self.progress.totalUnitCount = totalBytesExpectedToSend; - self.metadata = _uploadMetadata; - [self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot]; - self.state = FIRStorageTaskStateRunning; + weakSelf.state = FIRStorageTaskStateProgress; + weakSelf.progress.completedUnitCount = totalBytesSent; + weakSelf.progress.totalUnitCount = totalBytesExpectedToSend; + weakSelf.metadata = _uploadMetadata; + [weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:weakSelf.snapshot]; + weakSelf.state = FIRStorageTaskStateRunning; }]; _uploadFetcher = uploadFetcher; // Process fetches self.state = FIRStorageTaskStateRunning; - [_uploadFetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data, - NSError *_Nullable error) { + +#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]; @@ -130,6 +140,7 @@ self.metadata = _uploadMetadata; [self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot]; [self removeAllObservers]; + _fetcherCompletion = nil; return; } @@ -156,6 +167,13 @@ [self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot]; [self removeAllObservers]; + _fetcherCompletion = nil; + }; +#pragma clang diagnostic pop + + [_uploadFetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data, + NSError *_Nullable error) { + weakSelf.fetcherCompletion(data, error); }]; } diff --git a/Firebase/Storage/Private/FIRStorageTask_Private.h b/Firebase/Storage/Private/FIRStorageTask_Private.h index 598006b..8a72cf7 100644 --- a/Firebase/Storage/Private/FIRStorageTask_Private.h +++ b/Firebase/Storage/Private/FIRStorageTask_Private.h @@ -62,6 +62,8 @@ NS_ASSUME_NONNULL_BEGIN @property(readonly, nonatomic) GTMSessionFetcherService *fetcherService; +@property(readonly) GTMSessionFetcherCompletionHandler fetcherCompletion; + /** * Creates a new FIRStorageTask initialized with a FIRStorageReference and GTMSessionFetcherService. * @param reference A FIRStorageReference the task will be performed on. -- cgit v1.2.3