@@ -23,6 +23,7 @@ @implementation FIRStorageDownloadTask
23
23
24
24
@synthesize progress = _progress;
25
25
@synthesize fetcher = _fetcher;
26
+ @synthesize fetcherCompletion = _fetcherCompletion;
26
27
27
28
- (instancetype )initWithReference : (FIRStorageReference *)reference
28
29
fetcherService : (GTMSessionFetcherService *)service
@@ -35,6 +36,10 @@ - (instancetype)initWithReference:(FIRStorageReference *)reference
35
36
return self;
36
37
}
37
38
39
+ - (void ) dealloc {
40
+ [_fetcher stopFetching ];
41
+ }
42
+
38
43
- (void )enqueue {
39
44
[self enqueueWithData: nil ];
40
45
}
@@ -60,9 +65,12 @@ - (void)enqueueWithData:(nullable NSData *)resumeData {
60
65
fetcher.comment = @" Starting DownloadTask" ;
61
66
}
62
67
68
+ __weak FIRStorageDownloadTask *weakSelf = self;
69
+
63
70
[fetcher setResumeDataBlock: ^(NSData *data) {
64
71
if (data) {
65
- _downloadData = data;
72
+ FIRStorageDownloadTask *strongSelf = weakSelf;
73
+ strongSelf->_downloadData = data;
66
74
}
67
75
}];
68
76
@@ -73,30 +81,31 @@ - (void)enqueueWithData:(nullable NSData *)resumeData {
73
81
[fetcher setDestinationFileURL: _fileURL];
74
82
[fetcher setDownloadProgressBlock: ^(int64_t bytesWritten, int64_t totalBytesWritten,
75
83
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;
82
90
}];
83
91
} else {
84
92
// Handle data downloads
85
93
[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;
93
101
}];
94
102
}
95
103
96
104
_fetcher = fetcher;
97
105
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) {
100
109
// Fire last progress updates
101
110
[self fireHandlersForStatus: FIRStorageTaskStatusProgress snapshot: self .snapshot];
102
111
@@ -106,6 +115,7 @@ - (void)enqueueWithData:(nullable NSData *)resumeData {
106
115
self.error = [FIRStorageErrors errorWithServerError: error reference: self .reference];
107
116
[self fireHandlersForStatus: FIRStorageTaskStatusFailure snapshot: self .snapshot];
108
117
[self removeAllObservers ];
118
+ _fetcherCompletion = nil ;
109
119
return ;
110
120
}
111
121
@@ -118,6 +128,13 @@ - (void)enqueueWithData:(nullable NSData *)resumeData {
118
128
119
129
[self fireHandlersForStatus: FIRStorageTaskStatusSuccess snapshot: self .snapshot];
120
130
[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);
121
138
}];
122
139
}
123
140
0 commit comments