Skip to content

Commit 5cb9446

Browse files
Calling stopFetching on GTMSessionFetcher to stop callbacks from bein… (#81)
* 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
1 parent c47a19d commit 5cb9446

File tree

6 files changed

+123
-28
lines changed

6 files changed

+123
-28
lines changed

Firebase/Storage/FIRStorageDeleteTask.m

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ @implementation FIRStorageDeleteTask {
2121
FIRStorageVoidError _completion;
2222
}
2323

24+
@synthesize fetcher = _fetcher;
25+
@synthesize fetcherCompletion = _fetcherCompletion;
26+
27+
- (void) dealloc {
28+
[_fetcher stopFetching];
29+
}
30+
2431
- (instancetype)initWithReference:(FIRStorageReference *)reference
2532
fetcherService:(GTMSessionFetcherService *)service
2633
completion:(FIRStorageVoidError)completion {
@@ -40,14 +47,26 @@ - (void)enqueue {
4047
_completion = nil;
4148

4249
GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request];
50+
_fetcher = fetcher;
51+
4352
fetcher.comment = @"DeleteTask";
44-
[fetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) {
53+
54+
#pragma clang diagnostic push
55+
#pragma clang diagnostic ignored "-Warc-retain-cycles"
56+
_fetcherCompletion = ^(NSData *_Nullable data, NSError *_Nullable error) {
4557
if (!self.error) {
4658
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
4759
}
4860
if (callback) {
4961
callback(self.error);
5062
}
63+
_fetcherCompletion = nil;
64+
};
65+
#pragma clang diangostic pop
66+
67+
__weak FIRStorageDeleteTask* weakSelf = self;
68+
[fetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data, NSError *_Nullable error) {
69+
weakSelf.fetcherCompletion(data, error);
5170
}];
5271
}
5372

Firebase/Storage/FIRStorageDownloadTask.m

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ @implementation FIRStorageDownloadTask
2323

2424
@synthesize progress = _progress;
2525
@synthesize fetcher = _fetcher;
26+
@synthesize fetcherCompletion = _fetcherCompletion;
2627

2728
- (instancetype)initWithReference:(FIRStorageReference *)reference
2829
fetcherService:(GTMSessionFetcherService *)service
@@ -35,6 +36,10 @@ - (instancetype)initWithReference:(FIRStorageReference *)reference
3536
return self;
3637
}
3738

39+
- (void) dealloc {
40+
[_fetcher stopFetching];
41+
}
42+
3843
- (void)enqueue {
3944
[self enqueueWithData:nil];
4045
}
@@ -60,9 +65,12 @@ - (void)enqueueWithData:(nullable NSData *)resumeData {
6065
fetcher.comment = @"Starting DownloadTask";
6166
}
6267

68+
__weak FIRStorageDownloadTask *weakSelf = self;
69+
6370
[fetcher setResumeDataBlock:^(NSData *data) {
6471
if (data) {
65-
_downloadData = data;
72+
FIRStorageDownloadTask *strongSelf = weakSelf;
73+
strongSelf->_downloadData = data;
6674
}
6775
}];
6876

@@ -73,30 +81,31 @@ - (void)enqueueWithData:(nullable NSData *)resumeData {
7381
[fetcher setDestinationFileURL:_fileURL];
7482
[fetcher setDownloadProgressBlock:^(int64_t bytesWritten, int64_t totalBytesWritten,
7583
int64_t totalBytesExpectedToWrite) {
76-
self.state = FIRStorageTaskStateProgress;
77-
self.progress.completedUnitCount = totalBytesWritten;
78-
self.progress.totalUnitCount = totalBytesExpectedToWrite;
79-
FIRStorageTaskSnapshot *snapshot = self.snapshot;
80-
[self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot];
81-
self.state = FIRStorageTaskStateRunning;
84+
weakSelf.state = FIRStorageTaskStateProgress;
85+
weakSelf.progress.completedUnitCount = totalBytesWritten;
86+
weakSelf.progress.totalUnitCount = totalBytesExpectedToWrite;
87+
FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot;
88+
[weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot];
89+
weakSelf.state = FIRStorageTaskStateRunning;
8290
}];
8391
} else {
8492
// Handle data downloads
8593
[fetcher setReceivedProgressBlock:^(int64_t bytesWritten, int64_t totalBytesWritten) {
86-
self.state = FIRStorageTaskStateProgress;
87-
self.progress.completedUnitCount = totalBytesWritten;
88-
int64_t totalLength = [[self.fetcher response] expectedContentLength];
89-
self.progress.totalUnitCount = totalLength;
90-
FIRStorageTaskSnapshot *snapshot = self.snapshot;
91-
[self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot];
92-
self.state = FIRStorageTaskStateRunning;
94+
weakSelf.state = FIRStorageTaskStateProgress;
95+
weakSelf.progress.completedUnitCount = totalBytesWritten;
96+
int64_t totalLength = [[weakSelf.fetcher response] expectedContentLength];
97+
weakSelf.progress.totalUnitCount = totalLength;
98+
FIRStorageTaskSnapshot *snapshot = weakSelf.snapshot;
99+
[weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:snapshot];
100+
weakSelf.state = FIRStorageTaskStateRunning;
93101
}];
94102
}
95103

96104
_fetcher = fetcher;
97105

98-
self.state = FIRStorageTaskStateRunning;
99-
[self.fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
106+
#pragma clang diagnostic push
107+
#pragma clang diagnostic ignored "-Warc-retain-cycles"
108+
_fetcherCompletion = ^(NSData *data, NSError *error) {
100109
// Fire last progress updates
101110
[self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot];
102111

@@ -106,6 +115,7 @@ - (void)enqueueWithData:(nullable NSData *)resumeData {
106115
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
107116
[self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot];
108117
[self removeAllObservers];
118+
_fetcherCompletion = nil;
109119
return;
110120
}
111121

@@ -118,6 +128,13 @@ - (void)enqueueWithData:(nullable NSData *)resumeData {
118128

119129
[self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot];
120130
[self removeAllObservers];
131+
_fetcherCompletion = nil;
132+
};
133+
#pragma clang diagnostic pop
134+
135+
self.state = FIRStorageTaskStateRunning;
136+
[self.fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
137+
weakSelf.fetcherCompletion(data, error);
121138
}];
122139
}
123140

Firebase/Storage/FIRStorageGetMetadataTask.m

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ @implementation FIRStorageGetMetadataTask {
2626
FIRStorageVoidMetadataError _completion;
2727
}
2828

29+
@synthesize fetcher = _fetcher;
30+
@synthesize fetcherCompletion = _fetcherCompletion;
31+
2932
- (instancetype)initWithReference:(FIRStorageReference *)reference
3033
fetcherService:(GTMSessionFetcherService *)service
3134
completion:(FIRStorageVoidMetadataError)completion {
@@ -36,6 +39,10 @@ - (instancetype)initWithReference:(FIRStorageReference *)reference
3639
return self;
3740
}
3841

42+
- (void) dealloc {
43+
[_fetcher stopFetching];
44+
}
45+
3946
- (void)enqueue {
4047
NSMutableURLRequest *request = [self.baseRequest mutableCopy];
4148
request.HTTPMethod = @"GET";
@@ -45,15 +52,20 @@ - (void)enqueue {
4552
_completion = nil;
4653

4754
GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request];
55+
_fetcher = fetcher;
4856
fetcher.comment = @"GetMetadataTask";
49-
[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
57+
58+
#pragma clang diagnostic push
59+
#pragma clang diagnostic ignored "-Warc-retain-cycles"
60+
_fetcherCompletion = ^(NSData *data, NSError *error) {
5061
if (error) {
5162
if (!self.error) {
5263
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
5364
}
5465
if (callback) {
5566
callback(nil, self.error);
5667
}
68+
_fetcherCompletion = nil;
5769
return;
5870
}
5971

@@ -78,6 +90,13 @@ - (void)enqueue {
7890
callback(nil, self.error);
7991
}
8092
}
93+
_fetcherCompletion = nil;
94+
};
95+
#pragma clang diagnostic pop
96+
97+
__weak FIRStorageGetMetadataTask *weakSelf = self;
98+
[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
99+
weakSelf.fetcherCompletion(data, error);
81100
}];
82101
}
83102

Firebase/Storage/FIRStorageUpdateMetadataTask.m

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ @implementation FIRStorageUpdateMetadataTask {
2424
FIRStorageMetadata *_updateMetadata;
2525
}
2626

27+
@synthesize fetcher = _fetcher;
28+
@synthesize fetcherCompletion = _fetcherCompletion;
29+
2730
- (instancetype)initWithReference:(FIRStorageReference *)reference
2831
fetcherService:(GTMSessionFetcherService *)service
2932
metadata:(FIRStorageMetadata *)metadata
@@ -36,6 +39,10 @@ - (instancetype)initWithReference:(FIRStorageReference *)reference
3639
return self;
3740
}
3841

42+
- (void) dealloc {
43+
[_fetcher stopFetching];
44+
}
45+
3946
- (void)enqueue {
4047
NSMutableURLRequest *request = [self.baseRequest mutableCopy];
4148
NSDictionary *updateDictionary = [_updateMetadata dictionaryRepresentation];
@@ -52,15 +59,19 @@ - (void)enqueue {
5259
_completion = nil;
5360

5461
GTMSessionFetcher *fetcher = [self.fetcherService fetcherWithRequest:request];
55-
fetcher.comment = @"UpdateMetadataTask";
56-
[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
62+
_fetcher = fetcher;
63+
64+
#pragma clang diagnostic push
65+
#pragma clang diagnostic ignored "-Warc-retain-cycles"
66+
_fetcherCompletion =^(NSData *data, NSError *error) {
5767
if (error) {
5868
if (!self.error) {
5969
self.error = [FIRStorageErrors errorWithServerError:error reference:self.reference];
6070
}
6171
if (callback) {
6272
callback(nil, self.error);
6373
}
74+
_fetcherCompletion = nil;
6475
return;
6576
}
6677

@@ -85,6 +96,15 @@ - (void)enqueue {
8596
callback(nil, self.error);
8697
}
8798
}
99+
_fetcherCompletion = nil;
100+
};
101+
#pragma clang diagnostic pop
102+
103+
fetcher.comment = @"UpdateMetadataTask";
104+
105+
__weak FIRStorageUpdateMetadataTask *weakSelf = self;
106+
[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
107+
weakSelf.fetcherCompletion(data, error);
88108
}];
89109
}
90110

Firebase/Storage/FIRStorageUploadTask.m

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
@implementation FIRStorageUploadTask
2626

2727
@synthesize progress = _progress;
28+
@synthesize fetcherCompletion = _fetcherCompletion;
2829

2930
- (instancetype)initWithReference:(FIRStorageReference *)reference
3031
fetcherService:(GTMSessionFetcherService *)service
@@ -62,6 +63,10 @@ - (instancetype)initWithReference:(FIRStorageReference *)reference
6263
return self;
6364
}
6465

66+
- (void) dealloc {
67+
[_uploadFetcher stopFetching];
68+
}
69+
6570
- (void)enqueue {
6671
NSAssert([NSThread isMainThread], @"Upload attempting to execute on non main queue! Please only "
6772
@"execute this method on the main queue.");
@@ -103,23 +108,28 @@ - (void)enqueue {
103108
}
104109

105110
uploadFetcher.maxRetryInterval = self.reference.storage.maxUploadRetryTime;
111+
112+
__weak FIRStorageUploadTask* weakSelf = self;
106113

107114
[uploadFetcher setSendProgressBlock:^(int64_t bytesSent, int64_t totalBytesSent,
108115
int64_t totalBytesExpectedToSend) {
109-
self.state = FIRStorageTaskStateProgress;
110-
self.progress.completedUnitCount = totalBytesSent;
111-
self.progress.totalUnitCount = totalBytesExpectedToSend;
112-
self.metadata = _uploadMetadata;
113-
[self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot];
114-
self.state = FIRStorageTaskStateRunning;
116+
weakSelf.state = FIRStorageTaskStateProgress;
117+
weakSelf.progress.completedUnitCount = totalBytesSent;
118+
weakSelf.progress.totalUnitCount = totalBytesExpectedToSend;
119+
weakSelf.metadata = _uploadMetadata;
120+
[weakSelf fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:weakSelf.snapshot];
121+
weakSelf.state = FIRStorageTaskStateRunning;
115122
}];
116123

117124
_uploadFetcher = uploadFetcher;
118125

119126
// Process fetches
120127
self.state = FIRStorageTaskStateRunning;
121-
[_uploadFetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data,
122-
NSError *_Nullable error) {
128+
129+
#pragma clang diagnostic push
130+
#pragma clang diagnostic ignored "-Warc-retain-cycles"
131+
_fetcherCompletion = ^(NSData *_Nullable data,
132+
NSError *_Nullable error) {
123133
// Fire last progress updates
124134
[self fireHandlersForStatus:FIRStorageTaskStatusProgress snapshot:self.snapshot];
125135

@@ -130,6 +140,7 @@ - (void)enqueue {
130140
self.metadata = _uploadMetadata;
131141
[self fireHandlersForStatus:FIRStorageTaskStatusFailure snapshot:self.snapshot];
132142
[self removeAllObservers];
143+
_fetcherCompletion = nil;
133144
return;
134145
}
135146

@@ -156,6 +167,13 @@ - (void)enqueue {
156167

157168
[self fireHandlersForStatus:FIRStorageTaskStatusSuccess snapshot:self.snapshot];
158169
[self removeAllObservers];
170+
_fetcherCompletion = nil;
171+
};
172+
#pragma clang diagnostic pop
173+
174+
[_uploadFetcher beginFetchWithCompletionHandler:^(NSData *_Nullable data,
175+
NSError *_Nullable error) {
176+
weakSelf.fetcherCompletion(data, error);
159177
}];
160178
}
161179

Firebase/Storage/Private/FIRStorageTask_Private.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ NS_ASSUME_NONNULL_BEGIN
6262

6363
@property(readonly, nonatomic) GTMSessionFetcherService *fetcherService;
6464

65+
@property(readonly) GTMSessionFetcherCompletionHandler fetcherCompletion;
66+
6567
/**
6668
* Creates a new FIRStorageTask initialized with a FIRStorageReference and GTMSessionFetcherService.
6769
* @param reference A FIRStorageReference the task will be performed on.

0 commit comments

Comments
 (0)