mirror of
https://github.com/immich-app/immich
synced 2025-11-14 17:36:12 +00:00
fix(mobile): pause image loading on inactive state (#21543)
* pause image loading * make thumbhashes wait too
This commit is contained in:
parent
b82e29fbb4
commit
e427778a96
1 changed files with 24 additions and 0 deletions
|
|
@ -46,6 +46,23 @@ class ThumbnailApiImpl: ThumbnailApi {
|
||||||
assetCache.countLimit = 10000
|
assetCache.countLimit = 10000
|
||||||
return assetCache
|
return assetCache
|
||||||
}()
|
}()
|
||||||
|
private static let activitySemaphore = DispatchSemaphore(value: 1)
|
||||||
|
private static let willResignActiveObserver = NotificationCenter.default.addObserver(
|
||||||
|
forName: UIApplication.willResignActiveNotification,
|
||||||
|
object: nil,
|
||||||
|
queue: .main
|
||||||
|
) { _ in
|
||||||
|
processingQueue.suspend()
|
||||||
|
activitySemaphore.wait()
|
||||||
|
}
|
||||||
|
private static let didBecomeActiveObserver = NotificationCenter.default.addObserver(
|
||||||
|
forName: UIApplication.didBecomeActiveNotification,
|
||||||
|
object: nil,
|
||||||
|
queue: .main
|
||||||
|
) { _ in
|
||||||
|
processingQueue.resume()
|
||||||
|
activitySemaphore.signal()
|
||||||
|
}
|
||||||
|
|
||||||
func getThumbhash(thumbhash: String, completion: @escaping (Result<[String : Int64], any Error>) -> Void) {
|
func getThumbhash(thumbhash: String, completion: @escaping (Result<[String : Int64], any Error>) -> Void) {
|
||||||
Self.processingQueue.async {
|
Self.processingQueue.async {
|
||||||
|
|
@ -53,6 +70,7 @@ class ThumbnailApiImpl: ThumbnailApi {
|
||||||
else { return completion(.failure(PigeonError(code: "", message: "Invalid base64 string: \(thumbhash)", details: nil)))}
|
else { return completion(.failure(PigeonError(code: "", message: "Invalid base64 string: \(thumbhash)", details: nil)))}
|
||||||
|
|
||||||
let (width, height, pointer) = thumbHashToRGBA(hash: data)
|
let (width, height, pointer) = thumbHashToRGBA(hash: data)
|
||||||
|
self.waitForActiveState()
|
||||||
completion(.success(["pointer": Int64(Int(bitPattern: pointer.baseAddress)), "width": Int64(width), "height": Int64(height)]))
|
completion(.success(["pointer": Int64(Int(bitPattern: pointer.baseAddress)), "width": Int64(width), "height": Int64(height)]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -142,6 +160,7 @@ class ThumbnailApiImpl: ThumbnailApi {
|
||||||
return completion(Self.cancelledResult)
|
return completion(Self.cancelledResult)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.waitForActiveState()
|
||||||
completion(.success(["pointer": Int64(Int(bitPattern: pointer)), "width": Int64(cgImage.width), "height": Int64(cgImage.height)]))
|
completion(.success(["pointer": Int64(Int(bitPattern: pointer)), "width": Int64(cgImage.width), "height": Int64(cgImage.height)]))
|
||||||
Self.removeRequest(requestId: requestId)
|
Self.removeRequest(requestId: requestId)
|
||||||
}
|
}
|
||||||
|
|
@ -184,4 +203,9 @@ class ThumbnailApiImpl: ThumbnailApi {
|
||||||
assetQueue.async { assetCache.setObject(asset, forKey: assetId as NSString) }
|
assetQueue.async { assetCache.setObject(asset, forKey: assetId as NSString) }
|
||||||
return asset
|
return asset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func waitForActiveState() {
|
||||||
|
Self.activitySemaphore.wait()
|
||||||
|
Self.activitySemaphore.signal()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue