Skip to content

Commit 4883ced

Browse files
authored
[storage] Use async GTMSessionFetcher method (#13405)
1 parent 81b2451 commit 4883ced

File tree

2 files changed

+45
-53
lines changed

2 files changed

+45
-53
lines changed

FirebaseStorage/Sources/StorageDownloadTask.swift

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ open class StorageDownloadTask: StorageObservableTask, StorageTaskManagement {
8585
}
8686

8787
private var fetcher: GTMSessionFetcher?
88-
private var fetcherCompletion: ((Data?, NSError?) -> Void)?
8988
var downloadData: Data?
9089
// Hold completion in object to force it to be retained until completion block is called.
9190
var completionData: ((Data?, Error?) -> Void)?
@@ -104,7 +103,7 @@ open class StorageDownloadTask: StorageObservableTask, StorageTaskManagement {
104103
self.fetcher?.stopFetching()
105104
}
106105

107-
func enqueueImplementation(resumeWith resumeData: Data? = nil) {
106+
private func enqueueImplementation(resumeWith resumeData: Data? = nil) {
108107
dispatchQueue.async { [weak self] in
109108
guard let self = self else { return }
110109
self.state = .queueing
@@ -153,32 +152,29 @@ open class StorageDownloadTask: StorageObservableTask, StorageTaskManagement {
153152
}
154153
}
155154
self.fetcher = fetcher
156-
157-
// Capture self here to retain until completion.
158-
self.fetcherCompletion = { [self] (data: Data?, error: NSError?) in
159-
defer {
160-
self.removeAllObservers()
161-
self.fetcherCompletion = nil
162-
}
163-
self.fire(for: .progress, snapshot: self.snapshot)
164-
165-
// Handle potential issues with download
166-
if let error {
155+
self.state = .running
156+
Task {
157+
do {
158+
let data = try await self.fetcher?.beginFetch()
159+
// Fire last progress updates
160+
self.fire(for: .progress, snapshot: self.snapshot)
161+
162+
// Download completed successfully, fire completion callbacks
163+
self.state = .success
164+
if let data {
165+
self.downloadData = data
166+
}
167+
self.fire(for: .success, snapshot: self.snapshot)
168+
} catch {
169+
self.fire(for: .progress, snapshot: self.snapshot)
167170
self.state = .failed
168-
self.error = StorageErrorCode.error(withServerError: error, ref: self.reference)
171+
self.error = StorageErrorCode.error(
172+
withServerError: error as NSError,
173+
ref: self.reference
174+
)
169175
self.fire(for: .failure, snapshot: self.snapshot)
170-
return
171176
}
172-
// Download completed successfully, fire completion callbacks
173-
self.state = .success
174-
if let data {
175-
self.downloadData = data
176-
}
177-
self.fire(for: .success, snapshot: self.snapshot)
178-
}
179-
self.state = .running
180-
self.fetcher?.beginFetch { [self] data, error in
181-
self.fetcherCompletion?(data, error as? NSError)
177+
self.removeAllObservers()
182178
}
183179
}
184180
}

FirebaseStorage/Sources/StorageUploadTask.swift

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -115,38 +115,36 @@ import Foundation
115115

116116
// Process fetches
117117
self.state = .running
118+
Task {
119+
do {
120+
let data = try await self.uploadFetcher?.beginFetch()
121+
// Fire last progress updates
122+
self.fire(for: .progress, snapshot: self.snapshot)
123+
124+
// Upload completed successfully, fire completion callbacks
125+
self.state = .success
118126

119-
self.fetcherCompletion = { [self] (data: Data?, error: NSError?) in
120-
// Fire last progress updates
121-
self.fire(for: .progress, snapshot: self.snapshot)
127+
guard let data = data else {
128+
fatalError("Internal Error: uploadFetcher returned with nil data and no error")
129+
}
122130

123-
// Handle potential issues with upload
124-
if let error {
131+
if let responseDictionary = try? JSONSerialization
132+
.jsonObject(with: data) as? [String: AnyHashable] {
133+
let metadata = StorageMetadata(dictionary: responseDictionary)
134+
metadata.fileType = .file
135+
self.metadata = metadata
136+
} else {
137+
self.error = StorageErrorCode.error(withInvalidRequest: data)
138+
}
139+
self.finishTaskWithStatus(status: .success, snapshot: self.snapshot)
140+
} catch {
141+
self.fire(for: .progress, snapshot: self.snapshot)
125142
self.state = .failed
126-
self.error = StorageErrorCode.error(withServerError: error, ref: self.reference)
143+
self.error = StorageErrorCode.error(withServerError: error as NSError,
144+
ref: self.reference)
127145
self.metadata = self.uploadMetadata
128146
self.finishTaskWithStatus(status: .failure, snapshot: self.snapshot)
129-
return
130-
}
131-
// Upload completed successfully, fire completion callbacks
132-
self.state = .success
133-
134-
guard let data = data else {
135-
fatalError("Internal Error: fetcherCompletion returned with nil data and nil error")
136-
}
137-
138-
if let responseDictionary = try? JSONSerialization
139-
.jsonObject(with: data) as? [String: AnyHashable] {
140-
let metadata = StorageMetadata(dictionary: responseDictionary)
141-
metadata.fileType = .file
142-
self.metadata = metadata
143-
} else {
144-
self.error = StorageErrorCode.error(withInvalidRequest: data)
145147
}
146-
self.finishTaskWithStatus(status: .success, snapshot: self.snapshot)
147-
}
148-
self.uploadFetcher?.beginFetch { [weak self] (data: Data?, error: Error?) in
149-
self?.fetcherCompletion?(data, error as NSError?)
150148
}
151149
}
152150
}
@@ -202,7 +200,6 @@ import Foundation
202200
}
203201

204202
private var uploadFetcher: GTMSessionUploadFetcher?
205-
private var fetcherCompletion: ((Data?, NSError?) -> Void)?
206203
private var uploadMetadata: StorageMetadata
207204
private var uploadData: Data?
208205
// Hold completion in object to force it to be retained until completion block is called.
@@ -247,7 +244,6 @@ import Foundation
247244
func finishTaskWithStatus(status: StorageTaskStatus, snapshot: StorageTaskSnapshot) {
248245
fire(for: status, snapshot: snapshot)
249246
removeAllObservers()
250-
fetcherCompletion = nil
251247
}
252248

253249
private func GCSEscapedString(_ input: String?) -> String? {

0 commit comments

Comments
 (0)