diff --git a/Shared/Extensions/RSImage-Extensions.swift b/Shared/Extensions/RSImage-Extensions.swift index e6f515270..94ae44892 100644 --- a/Shared/Extensions/RSImage-Extensions.swift +++ b/Shared/Extensions/RSImage-Extensions.swift @@ -6,6 +6,7 @@ // Copyright © 2019 Ranchero Software. All rights reserved. // +import RSCore #if os(macOS) import AppKit #else @@ -18,13 +19,8 @@ extension RSImage { static let maxIconSize = 48 - static func scaledForIcon(_ data: Data, imageResultBlock: @escaping (RSImage?) -> Void) { - DispatchQueue.global(qos: .default).async { - let image = RSImage.scaledForIcon(data) - DispatchQueue.main.async { - imageResultBlock(image) - } - } + static func scaledForIcon(_ data: Data, imageResultBlock: @escaping ImageResultBlock) { + IconScalerQueue.shared.scaledForIcon(data, imageResultBlock) } static func scaledForIcon(_ data: Data) -> RSImage? { @@ -41,3 +37,26 @@ extension RSImage { #endif } } + +// MARK: - IconScalerQueue + +private class IconScalerQueue { + + static let shared = IconScalerQueue() + + private let queue: DispatchQueue = { + let q = DispatchQueue(label: "IconScaler", attributes: .initiallyInactive) + q.setTarget(queue: DispatchQueue.global(qos: .default)) + q.activate() + return q + }() + + func scaledForIcon(_ data: Data, _ imageResultBlock: @escaping ImageResultBlock) { + queue.async { + let image = RSImage.scaledForIcon(data) + DispatchQueue.main.async { + imageResultBlock(image) + } + } + } +}