Skip to content

Commit b109e01

Browse files
authored
Fix strict concurrency checking errors (#10518)
1 parent 611511b commit b109e01

8 files changed

+256
-293
lines changed

FirebaseStorage/Sources/Internal/StorageDeleteTask.swift

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -44,34 +44,34 @@ internal class StorageDeleteTask: StorageTask, StorageTaskManagement {
4444
* Prepares a task and begins execution.
4545
*/
4646
internal func enqueue() {
47-
weak var weakSelf = self
48-
dispatchQueue.async {
49-
guard let strongSelf = weakSelf else { return }
50-
strongSelf.state = .queueing
51-
var request = strongSelf.baseRequest
47+
let completion = taskCompletion
48+
taskCompletion = { (error: Error?) in
49+
completion?(error)
50+
// Reference self in completion handler in order to retain self until completion is called.
51+
self.taskCompletion = nil
52+
}
53+
dispatchQueue.async { [weak self] in
54+
guard let self = self else { return }
55+
self.state = .queueing
56+
var request = self.baseRequest
5257
request.httpMethod = "DELETE"
53-
request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime
54-
55-
let callback = strongSelf.taskCompletion
56-
strongSelf.taskCompletion = nil
58+
request.timeoutInterval = self.reference.storage.maxOperationRetryTime
5759

58-
let fetcher = strongSelf.fetcherService.fetcher(with: request)
60+
let fetcher = self.fetcherService.fetcher(with: request)
5961
fetcher.comment = "DeleteTask"
60-
strongSelf.fetcher = fetcher
62+
self.fetcher = fetcher
6163

62-
strongSelf.fetcherCompletion = { (data: Data?, error: NSError?) in
64+
self.fetcherCompletion = { [weak self] (data: Data?, error: NSError?) in
65+
guard let self = self else { return }
6366
if let error = error, self.error == nil {
64-
self.error = StorageErrorCode.error(withServerError: error, ref: strongSelf.reference)
67+
self.error = StorageErrorCode.error(withServerError: error, ref: self.reference)
6568
}
66-
callback?(self.error)
69+
self.taskCompletion?(self.error)
6770
self.fetcherCompletion = nil
6871
}
6972

70-
strongSelf.fetcher?.beginFetch { data, error in
71-
let strongSelf = weakSelf
72-
if let fetcherCompletion = strongSelf?.fetcherCompletion {
73-
fetcherCompletion(data, error as? NSError)
74-
}
73+
self.fetcher?.beginFetch { [weak self] data, error in
74+
self?.fetcherCompletion?(data, error as? NSError)
7575
}
7676
}
7777
}

FirebaseStorage/Sources/Internal/StorageGetDownloadURLTask.swift

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,25 @@ internal class StorageGetDownloadURLTask: StorageTask, StorageTaskManagement {
4444
* Prepares a task and begins execution.
4545
*/
4646
internal func enqueue() {
47-
weak var weakSelf = self
48-
dispatchQueue.async {
49-
guard let strongSelf = weakSelf else { return }
50-
var request = strongSelf.baseRequest
47+
if let completion = taskCompletion {
48+
taskCompletion = { (url: URL?, error: Error?) in
49+
completion(url, error)
50+
// Reference self in completion handler in order to retain self until completion is called.
51+
self.taskCompletion = nil
52+
}
53+
}
54+
dispatchQueue.async { [weak self] in
55+
guard let self = self else { return }
56+
var request = self.baseRequest
5157
request.httpMethod = "GET"
52-
request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime
58+
request.timeoutInterval = self.reference.storage.maxOperationRetryTime
5359

54-
let callback = strongSelf.taskCompletion
55-
strongSelf.taskCompletion = nil
56-
57-
let fetcher = strongSelf.fetcherService.fetcher(with: request)
60+
let fetcher = self.fetcherService.fetcher(with: request)
5861
fetcher.comment = "GetDownloadURLTask"
59-
strongSelf.fetcher = fetcher
62+
self.fetcher = fetcher
6063

61-
strongSelf.fetcherCompletion = { (data: Data?, error: NSError?) in
64+
self.fetcherCompletion = { [weak self] (data: Data?, error: NSError?) in
65+
guard let self = self else { return }
6266
var downloadURL: URL?
6367
if let error = error {
6468
if self.error == nil {
@@ -68,7 +72,7 @@ internal class StorageGetDownloadURLTask: StorageTask, StorageTaskManagement {
6872
if let data = data,
6973
let responseDictionary = try? JSONSerialization
7074
.jsonObject(with: data) as? [String: Any] {
71-
downloadURL = strongSelf.downloadURLFromMetadataDictionary(responseDictionary)
75+
downloadURL = self.downloadURLFromMetadataDictionary(responseDictionary)
7276
if downloadURL == nil {
7377
self.error = NSError(domain: StorageErrorDomain,
7478
code: StorageErrorCode.unknown.rawValue,
@@ -79,15 +83,12 @@ internal class StorageGetDownloadURLTask: StorageTask, StorageTaskManagement {
7983
self.error = StorageErrorCode.error(withInvalidRequest: data)
8084
}
8185
}
82-
callback?(downloadURL, self.error)
86+
self.taskCompletion?(downloadURL, self.error)
8387
self.fetcherCompletion = nil
8488
}
8589

86-
strongSelf.fetcher?.beginFetch { data, error in
87-
let strongSelf = weakSelf
88-
if let fetcherCompletion = strongSelf?.fetcherCompletion {
89-
fetcherCompletion(data, error as? NSError)
90-
}
90+
self.fetcher?.beginFetch { [weak self] data, error in
91+
self?.fetcherCompletion?(data, error as? NSError)
9192
}
9293
}
9394
}

FirebaseStorage/Sources/Internal/StorageGetMetadataTask.swift

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,26 @@ internal class StorageGetMetadataTask: StorageTask, StorageTaskManagement {
4444
* Prepares a task and begins execution.
4545
*/
4646
internal func enqueue() {
47-
weak var weakSelf = self
48-
dispatchQueue.async {
49-
guard let strongSelf = weakSelf else { return }
50-
strongSelf.state = .queueing
51-
var request = strongSelf.baseRequest
47+
if let completion = taskCompletion {
48+
taskCompletion = { (metadata: StorageMetadata?, error: Error?) in
49+
completion(metadata, error)
50+
// Reference self in completion handler in order to retain self until completion is called.
51+
self.taskCompletion = nil
52+
}
53+
}
54+
dispatchQueue.async { [weak self] in
55+
guard let self = self else { return }
56+
self.state = .queueing
57+
var request = self.baseRequest
5258
request.httpMethod = "GET"
53-
request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime
59+
request.timeoutInterval = self.reference.storage.maxOperationRetryTime
5460

55-
let callback = strongSelf.taskCompletion
56-
strongSelf.taskCompletion = nil
57-
58-
let fetcher = strongSelf.fetcherService.fetcher(with: request)
61+
let fetcher = self.fetcherService.fetcher(with: request)
5962
fetcher.comment = "GetMetadataTask"
60-
strongSelf.fetcher = fetcher
63+
self.fetcher = fetcher
6164

62-
strongSelf.fetcherCompletion = { (data: Data?, error: NSError?) in
65+
self.fetcherCompletion = { [weak self] (data: Data?, error: NSError?) in
66+
guard let self = self else { return }
6367
var metadata: StorageMetadata?
6468
if let error = error {
6569
if self.error == nil {
@@ -75,15 +79,12 @@ internal class StorageGetMetadataTask: StorageTask, StorageTaskManagement {
7579
self.error = StorageErrorCode.error(withInvalidRequest: data)
7680
}
7781
}
78-
callback?(metadata, self.error)
82+
self.taskCompletion?(metadata, self.error)
7983
self.fetcherCompletion = nil
8084
}
8185

82-
strongSelf.fetcher?.beginFetch { data, error in
83-
let strongSelf = weakSelf
84-
if let fetcherCompletion = strongSelf?.fetcherCompletion {
85-
fetcherCompletion(data, error as? NSError)
86-
}
86+
self.fetcher?.beginFetch { [weak self] data, error in
87+
self?.fetcherCompletion?(data, error as? NSError)
8788
}
8889
}
8990
}

FirebaseStorage/Sources/Internal/StorageListTask.swift

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@ internal class StorageListTask: StorageTask, StorageTaskManagement {
5252
self.pageSize = pageSize
5353
self.previousPageToken = previousPageToken
5454
super.init(reference: reference, service: fetcherService, queue: queue)
55-
taskCompletion = completion
55+
taskCompletion = { (listResult: StorageListResult?, error: NSError?) in
56+
completion?(listResult, error)
57+
// Reference self in completion handler in order to retain self until completion is called.
58+
self.taskCompletion = nil
59+
}
5660
}
5761

5862
deinit {
@@ -63,12 +67,18 @@ internal class StorageListTask: StorageTask, StorageTaskManagement {
6367
* Prepares a task and begins execution.
6468
*/
6569
internal func enqueue() {
66-
weak var weakSelf = self
67-
dispatchQueue.async {
68-
guard let strongSelf = weakSelf else { return }
70+
if let completion = taskCompletion {
71+
taskCompletion = { (listResult: StorageListResult?, error: NSError?) in
72+
completion(listResult, error)
73+
// Reference self in completion handler in order to retain self until completion is called.
74+
self.taskCompletion = nil
75+
}
76+
}
77+
dispatchQueue.async { [weak self] in
78+
guard let self = self else { return }
6979
var queryParams = [String: String]()
7080

71-
let prefix = strongSelf.reference.fullPath
81+
let prefix = self.reference.fullPath
7282
if prefix.count > 0 {
7383
queryParams["prefix"] = "\(prefix)/"
7484
}
@@ -80,34 +90,32 @@ internal class StorageListTask: StorageTask, StorageTaskManagement {
8090
// listAll() doesn't set a pageSize as this allows Firebase Storage to determine how many items
8191
// to return per page. This removes the need to backfill results if Firebase Storage filters
8292
// objects that are considered invalid (such as items with two consecutive slashes).
83-
if let pageSize = strongSelf.pageSize {
93+
if let pageSize = self.pageSize {
8494
queryParams["maxResults"] = "\(pageSize)"
8595
}
8696

87-
if let previousPageToken = strongSelf.previousPageToken {
97+
if let previousPageToken = self.previousPageToken {
8898
queryParams["pageToken"] = previousPageToken
8999
}
90100

91-
let root = strongSelf.reference.root()
101+
let root = self.reference.root()
92102
var request = StorageUtils.defaultRequestForReference(
93103
reference: root,
94104
queryParams: queryParams
95105
)
96106

97107
request.httpMethod = "GET"
98-
request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime
108+
request.timeoutInterval = self.reference.storage.maxOperationRetryTime
99109

100-
let callback = strongSelf.taskCompletion
101-
strongSelf.taskCompletion = nil
102-
103-
let fetcher = strongSelf.fetcherService.fetcher(with: request)
110+
let fetcher = self.fetcherService.fetcher(with: request)
104111
fetcher.comment = "ListTask"
105-
strongSelf.fetcher = fetcher
112+
self.fetcher = fetcher
106113

107-
strongSelf.fetcherCompletion = { (data: Data?, error: NSError?) in
114+
self.fetcherCompletion = { [weak self] (data: Data?, error: NSError?) in
115+
guard let self = self else { return }
108116
var listResult: StorageListResult?
109117
if let error = error, self.error == nil {
110-
self.error = StorageErrorCode.error(withServerError: error, ref: strongSelf.reference)
118+
self.error = StorageErrorCode.error(withServerError: error, ref: self.reference)
111119
} else {
112120
if let data = data,
113121
let responseDictionary = try? JSONSerialization
@@ -118,15 +126,12 @@ internal class StorageListTask: StorageTask, StorageTaskManagement {
118126
}
119127
}
120128

121-
callback?(listResult, self.error)
129+
self.taskCompletion?(listResult, self.error)
122130
self.fetcherCompletion = nil
123131
}
124132

125-
strongSelf.fetcher?.beginFetch { data, error in
126-
let strongSelf = weakSelf
127-
if let fetcherCompletion = strongSelf?.fetcherCompletion {
128-
fetcherCompletion(data, error as? NSError)
129-
}
133+
self.fetcher?.beginFetch { [weak self] data, error in
134+
self?.fetcherCompletion?(data, error as? NSError)
130135
}
131136
}
132137
}

FirebaseStorage/Sources/Internal/StorageUpdateMetadataTask.swift

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -47,28 +47,31 @@ internal class StorageUpdateMetadataTask: StorageTask, StorageTaskManagement {
4747
* Prepares a task and begins execution.
4848
*/
4949
internal func enqueue() {
50-
weak var weakSelf = self
51-
dispatchQueue.async {
52-
guard let strongSelf = weakSelf else { return }
53-
var request = strongSelf.baseRequest
54-
let updateDictionary = strongSelf.updateMetadata.updatedMetadata()
50+
let completion = taskCompletion
51+
taskCompletion = { (metadata: StorageMetadata?, error: Error?) in
52+
completion?(metadata, error)
53+
// Reference self in completion handler in order to retain self until completion is called.
54+
self.taskCompletion = nil
55+
}
56+
dispatchQueue.async { [weak self] in
57+
guard let self = self else { return }
58+
var request = self.baseRequest
59+
let updateDictionary = self.updateMetadata.updatedMetadata()
5560
let updateData = try? JSONSerialization.data(withJSONObject: updateDictionary)
5661
request.httpMethod = "PATCH"
57-
request.timeoutInterval = strongSelf.reference.storage.maxOperationRetryTime
62+
request.timeoutInterval = self.reference.storage.maxOperationRetryTime
5863
request.httpBody = updateData
5964
request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
6065
if let count = updateData?.count {
6166
request.setValue("\(count)", forHTTPHeaderField: "Content-Length")
6267
}
6368

64-
let callback = strongSelf.taskCompletion
65-
strongSelf.taskCompletion = nil
66-
67-
let fetcher = strongSelf.fetcherService.fetcher(with: request)
69+
let fetcher = self.fetcherService.fetcher(with: request)
6870
fetcher.comment = "GetMetadataTask"
69-
strongSelf.fetcher = fetcher
71+
self.fetcher = fetcher
7072

71-
strongSelf.fetcherCompletion = { (data: Data?, error: NSError?) in
73+
self.fetcherCompletion = { [weak self] (data: Data?, error: NSError?) in
74+
guard let self = self else { return }
7275
var metadata: StorageMetadata?
7376
if let error = error {
7477
if self.error == nil {
@@ -84,17 +87,14 @@ internal class StorageUpdateMetadataTask: StorageTask, StorageTaskManagement {
8487
self.error = StorageErrorCode.error(withInvalidRequest: data)
8588
}
8689
}
87-
callback?(metadata, self.error)
90+
self.taskCompletion?(metadata, self.error)
8891
self.fetcherCompletion = nil
8992
}
9093

9194
fetcher.comment = "UpdateMetadataTask"
9295

93-
strongSelf.fetcher?.beginFetch { data, error in
94-
let strongSelf = weakSelf
95-
if let fetcherCompletion = strongSelf?.fetcherCompletion {
96-
fetcherCompletion(data, error as? NSError)
97-
}
96+
self.fetcher?.beginFetch { [weak self] data, error in
97+
self?.fetcherCompletion?(data, error as? NSError)
9898
}
9999
}
100100
}

0 commit comments

Comments
 (0)