2
0
Эх сурвалжийг харах

优化渐进式加载扫描解码操作 通过串行队列减少计算频率 优化性能 (原来: 在开启progressiveJPEG后如果加载非连续JPEG格式图形是 会造成多余额外计算阻塞线程)

lixiang1994 6 жил өмнө
parent
commit
8bad9c3a29

+ 2 - 2
Sources/Extensions/UIButton+Kingfisher.swift

@@ -330,7 +330,7 @@ extension KingfisherWrapper where Base: UIButton {
     private var taskIdentifierInfo: TaskIdentifier {
         return  getAssociatedObject(base, &taskIdentifierKey) ?? {
             setRetainedAssociatedObject(base, &taskIdentifierKey, $0)
-            $0
+            return $0
         } (TaskIdentifier([:]))
     }
     
@@ -358,7 +358,7 @@ extension KingfisherWrapper where Base: UIButton {
     private var backgroundTaskIdentifierInfo: TaskIdentifier {
         return  getAssociatedObject(base, &backgroundTaskIdentifierKey) ?? {
             setRetainedAssociatedObject(base, &backgroundTaskIdentifierKey, $0)
-            $0
+            return $0
         } (TaskIdentifier([:]))
     }
     

+ 19 - 17
Sources/Image/ImageProgressive.swift

@@ -71,7 +71,7 @@ final class ImageProgressiveProvider: DataReceivingSideEffect {
     private let refresh: (Image) -> Void
     
     private let decoder: ImageProgressiveDecoder
-    private let queue = ImageProgressiveSerialQueue(.main)
+    private let queue = ImageProgressiveSerialQueue(.global(qos: .utility))
     
     init?(_ options: KingfisherParsedOptionsInfo,
           refresh: @escaping (Image) -> Void) {
@@ -89,16 +89,14 @@ final class ImageProgressiveProvider: DataReceivingSideEffect {
     func update(data: Data, with callbacks: [SessionDataTask.TaskCallback]) {
         guard !data.isEmpty else { return }
         
-        let interval = option.scanInterval
-        let isFastest = option.isFastestScan
-        
-        func add(decode data: Data) {
-            queue.add(minimum: interval) { completion in
-                guard self.onShouldApply() else {
-                    self.queue.clean()
-                    completion()
-                    return
-                }
+        queue.add(minimum: option.scanInterval) { completion in
+            guard self.onShouldApply() else {
+                self.queue.clean()
+                completion()
+                return
+            }
+            
+            func decode(_ data: Data) {
                 self.decoder.decode(data, with: callbacks) { image in
                     defer { completion() }
                     guard self.onShouldApply() else { return }
@@ -106,13 +104,13 @@ final class ImageProgressiveProvider: DataReceivingSideEffect {
                     self.refresh(image)
                 }
             }
-        }
-        
-        if isFastest {
-            add(decode: decoder.scanning(data) ?? Data())
             
-        } else {
-            decoder.scanning(data).forEach { add(decode: $0) }
+            if self.option.isFastestScan {
+                decode(self.decoder.scanning(data) ?? Data())
+                
+            } else {
+                self.decoder.scanning(data).forEach { decode($0) }
+            }
         }
     }
 }
@@ -301,4 +299,8 @@ private final class ImageProgressiveSerialQueue {
         items.forEach { $0.cancel() }
         items.removeAll()
     }
+    
+    deinit {
+        clean()
+    }
 }