From 2c77465d1ce726d182c8815a25f826ffaeba89a6 Mon Sep 17 00:00:00 2001 From: Avi Cieplinski Date: Wed, 17 Apr 2019 12:16:32 -0700 Subject: [PATCH 1/2] Fix warning about unowned dispatch queue used to retrieve tile images. --- MapboxSceneKit/Tile Fetching/MapboxHTTPAPI.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MapboxSceneKit/Tile Fetching/MapboxHTTPAPI.swift b/MapboxSceneKit/Tile Fetching/MapboxHTTPAPI.swift index a4882c5..e46d528 100644 --- a/MapboxSceneKit/Tile Fetching/MapboxHTTPAPI.swift +++ b/MapboxSceneKit/Tile Fetching/MapboxHTTPAPI.swift @@ -26,9 +26,10 @@ enum FetchError: Int { } internal final class MapboxHTTPAPI { + private static var tileDownloadTaskDispatchQueue = DispatchQueue(label: "com.mapbox.scenekit.api", attributes: [.concurrent]) private static var operationQueue: OperationQueue = { var operationQueue = OperationQueue() - operationQueue.underlyingQueue = DispatchQueue(label: "com.mapbox.scenekit.api", attributes: [.concurrent]) + operationQueue.underlyingQueue = tileDownloadTaskDispatchQueue operationQueue.name = "Mapbox API Queue" operationQueue.maxConcurrentOperationCount = 10 return operationQueue From e55e4ac667caadf6d3b6d03f0a9992b6b4be9176 Mon Sep 17 00:00:00 2001 From: Avi Cieplinski Date: Wed, 17 Apr 2019 14:34:45 -0700 Subject: [PATCH 2/2] More pendingFetches fixes. --- MapboxSceneKit/MapboxImageAPI.swift | 30 ++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/MapboxSceneKit/MapboxImageAPI.swift b/MapboxSceneKit/MapboxImageAPI.swift index bb595d2..b672ab6 100644 --- a/MapboxSceneKit/MapboxImageAPI.swift +++ b/MapboxSceneKit/MapboxImageAPI.swift @@ -113,7 +113,10 @@ public final class MapboxImageAPI: NSObject { let group = DispatchGroup() let groupID = UUID() - pendingFetches[groupID] = [UUID]() + self.pendingFetchesDispatchQueue.sync(flags: .barrier) { [weak self] in + guard let self = self else { return } + self.pendingFetches[groupID] = [UUID]() + } var completed: Int = 0 let total = bounding.xs.count * bounding.ys.count @@ -196,7 +199,10 @@ public final class MapboxImageAPI: NSObject { let group = DispatchGroup() let groupID = UUID() - pendingFetches[groupID] = [UUID]() + pendingFetchesDispatchQueue.sync(flags: .barrier) { [weak self] in + guard let self = self else { return } + self.pendingFetches[groupID] = [UUID]() + } var completed: Int = 0 let total = bounding.xs.count * bounding.ys.count @@ -236,7 +242,10 @@ public final class MapboxImageAPI: NSObject { } group.notify(queue: DispatchQueue.main) { - self.pendingFetches.removeValue(forKey: groupID) + self.pendingFetchesDispatchQueue.sync(flags: .barrier) { [weak self] in + guard let self = self else { return } + self.pendingFetches.removeValue(forKey: groupID) + } completion(error == nil ? imageBuilder.makeImage() : nil, error?.toNSError()) } @@ -248,13 +257,16 @@ public final class MapboxImageAPI: NSObject { **/ @objc func cancelRequestWithID(_ groupID: UUID) { - guard let tasks = pendingFetches[groupID] else { - return - } - for task in tasks { - httpAPI.cancelRequestWithID(task) + self.pendingFetchesDispatchQueue.sync(flags: .barrier) { [weak self] in + guard let tasks = pendingFetches[groupID] else { + return + } + for task in tasks { + httpAPI.cancelRequestWithID(task) + } + + self?.pendingFetches.removeValue(forKey: groupID) } - pendingFetches.removeValue(forKey: groupID) } //MARK: - Helpers