Skip to content

Commit 563aacd

Browse files
committed
Synchronizing access to add, remove and cancel thumbnail requests.
1 parent 9b51fd8 commit 563aacd

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

Sources/Filestack/UI/Internal/Controllers/CloudSourceTabBarController.swift

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,29 @@
99
import FilestackSDK
1010
import UIKit
1111

12+
private struct URLSessionTaskTracker {
13+
private var tasks: [URLSessionTask] = [URLSessionTask]()
14+
private let queue = DispatchQueue(label: "com.filestack.URLSessionTaskTracker")
15+
16+
mutating func add(_ task: URLSessionTask) {
17+
queue.sync { tasks.append(task) }
18+
}
19+
20+
mutating func remove(_ task: URLSessionTask) {
21+
queue.sync { tasks.removeAll { $0 == task } }
22+
}
23+
24+
mutating func cancelPendingAndRemove() {
25+
queue.sync {
26+
for request in tasks {
27+
request.cancel()
28+
}
29+
30+
tasks.removeAll()
31+
}
32+
}
33+
}
34+
1235
class CloudSourceTabBarController: UITabBarController, CloudSourceDataSource {
1336
var client: Client!
1437
var storeOptions: StorageOptions!
@@ -35,7 +58,7 @@ class CloudSourceTabBarController: UITabBarController, CloudSourceDataSource {
3558
private let session = URLSession.filestackDefault
3659
private var toggleViewTypeButton: UIBarButtonItem?
3760
private var currentRequest: Cancellable?
38-
private var thumbnailTaskRequests: [URLSessionDataTask] = [URLSessionDataTask]()
61+
private var thumbnailTasks = URLSessionTaskTracker()
3962
private weak var uploadMonitorViewController: MonitorViewController?
4063
private var uploaderObserver: NSKeyValueObservation?
4164

@@ -210,9 +233,7 @@ class CloudSourceTabBarController: UITabBarController, CloudSourceDataSource {
210233

211234
task = URLSession.filestackDefault.dataTask(with: urlRequest) { (data, response, error) in
212235
// Remove request from thumbnail requests
213-
if let idx = (self.thumbnailTaskRequests.firstIndex { $0 == task }) {
214-
self.thumbnailTaskRequests.remove(at: idx)
215-
}
236+
self.thumbnailTasks.remove(task)
216237

217238
var image: UIImage!
218239

@@ -234,7 +255,7 @@ class CloudSourceTabBarController: UITabBarController, CloudSourceDataSource {
234255
task.resume()
235256

236257
// Add request to thumbnail requests.
237-
thumbnailTaskRequests.append(task)
258+
thumbnailTasks.add(task)
238259
}
239260

240261
func search(text: String, completionHandler: @escaping (() -> Void)) {
@@ -288,11 +309,7 @@ class CloudSourceTabBarController: UITabBarController, CloudSourceDataSource {
288309
}
289310

290311
private func cancelPendingThumbnailRequests() {
291-
for request in thumbnailTaskRequests {
292-
request.cancel()
293-
}
294-
295-
thumbnailTaskRequests.removeAll()
312+
thumbnailTasks.cancelPendingAndRemove()
296313
}
297314

298315
// MARK: - Actions

0 commit comments

Comments
 (0)