Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions mobile/ios/Runner/Images/ImageProcessing.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import Foundation

enum ImageProcessing {
static let queue = DispatchQueue(label: "thumbnail.processing", qos: .userInitiated, attributes: .concurrent)
static let semaphore = DispatchSemaphore(value: ProcessInfo.processInfo.activeProcessorCount * 2)
static let queue = {
let q = OperationQueue()
q.name = "thumbnail.processing"
q.qualityOfService = .userInitiated
q.maxConcurrentOperationCount = ProcessInfo.processInfo.activeProcessorCount * 2
return q
}()
static let cancelledResult = Result<[String: Int64]?, any Error>.success(nil)
}
23 changes: 7 additions & 16 deletions mobile/ios/Runner/Images/LocalImagesImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import MobileCoreServices
import Photos

class LocalImageRequest {
weak var workItem: DispatchWorkItem?
weak var operation: Operation?
var isCancelled = false
let callback: (Result<[String: Int64]?, any Error>) -> Void

Expand Down Expand Up @@ -50,7 +50,7 @@ class LocalImageApiImpl: LocalImageApi {
}()

func getThumbhash(thumbhash: String, completion: @escaping (Result<[String : Int64], any Error>) -> Void) {
ImageProcessing.queue.async {
ImageProcessing.queue.addOperation {
guard let data = Data(base64Encoded: thumbhash)
else { return completion(.failure(PigeonError(code: "", message: "Invalid base64 string: \(thumbhash)", details: nil)))}

Expand All @@ -66,16 +66,7 @@ class LocalImageApiImpl: LocalImageApi {

func requestImage(assetId: String, requestId: Int64, width: Int64, height: Int64, isVideo: Bool, preferEncoded: Bool, completion: @escaping (Result<[String: Int64]?, any Error>) -> Void) {
let request = LocalImageRequest(callback: completion)
let item = DispatchWorkItem {
if request.isCancelled {
return completion(ImageProcessing.cancelledResult)
}

ImageProcessing.semaphore.wait()
defer {
ImageProcessing.semaphore.signal()
}

let operation = BlockOperation {
if request.isCancelled {
return completion(ImageProcessing.cancelledResult)
}
Expand Down Expand Up @@ -180,9 +171,9 @@ class LocalImageApiImpl: LocalImageApi {
}
}

request.workItem = item
request.operation = operation
Self.add(requestId: requestId, request: request)
ImageProcessing.queue.async(execute: item)
ImageProcessing.queue.addOperation(operation)
}

func cancelRequest(requestId: Int64) {
Expand All @@ -201,8 +192,8 @@ class LocalImageApiImpl: LocalImageApi {
requestQueue.async {
guard let request = requests.removeValue(forKey: requestId) else { return }
request.isCancelled = true
guard let item = request.workItem else { return }
if item.isCancelled {
guard let operation = request.operation else { return }
if operation.isCancelled {
cancelQueue.async { request.callback(ImageProcessing.cancelledResult) }
}
}
Expand Down
5 changes: 1 addition & 4 deletions mobile/ios/Runner/Images/RemoteImagesImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,7 @@ class RemoteImageApiImpl: NSObject, RemoteImageApi {
return request.completion(.failure(PigeonError(code: "", message: "No data received", details: nil)))
}

ImageProcessing.queue.async {
ImageProcessing.semaphore.wait()
defer { ImageProcessing.semaphore.signal() }

ImageProcessing.queue.addOperation {
if request.isCancelled {
return request.completion(ImageProcessing.cancelledResult)
}
Expand Down
Loading