Просмотр исходного кода

Merge pull request #1218 from lixiang1994/master

优化渐进式加载扫描解码性能
Wei Wang 6 лет назад
Родитель
Сommit
8eba22b036
2 измененных файлов с 25 добавлено и 25 удалено
  1. 6 8
      Sources/Extensions/UIButton+Kingfisher.swift
  2. 19 17
      Sources/Image/ImageProgressive.swift

+ 6 - 8
Sources/Extensions/UIButton+Kingfisher.swift

@@ -329,10 +329,9 @@ extension KingfisherWrapper where Base: UIButton {
     
     
     private var taskIdentifierInfo: TaskIdentifier {
     private var taskIdentifierInfo: TaskIdentifier {
         return  getAssociatedObject(base, &taskIdentifierKey) ?? {
         return  getAssociatedObject(base, &taskIdentifierKey) ?? {
-            let value = TaskIdentifier([:])
-            setRetainedAssociatedObject(base, &taskIdentifierKey, value)
-            return value
-        }()
+            setRetainedAssociatedObject(base, &taskIdentifierKey, $0)
+            return $0
+        } (TaskIdentifier([:]))
     }
     }
     
     
     private var imageTask: DownloadTask? {
     private var imageTask: DownloadTask? {
@@ -358,10 +357,9 @@ extension KingfisherWrapper where Base: UIButton {
     
     
     private var backgroundTaskIdentifierInfo: TaskIdentifier {
     private var backgroundTaskIdentifierInfo: TaskIdentifier {
         return  getAssociatedObject(base, &backgroundTaskIdentifierKey) ?? {
         return  getAssociatedObject(base, &backgroundTaskIdentifierKey) ?? {
-            let value = TaskIdentifier([:])
-            setRetainedAssociatedObject(base, &backgroundTaskIdentifierKey, value)
-            return value
-        }()
+            setRetainedAssociatedObject(base, &backgroundTaskIdentifierKey, $0)
+            return $0
+        } (TaskIdentifier([:]))
     }
     }
     
     
     private var backgroundImageTask: DownloadTask? {
     private var backgroundImageTask: DownloadTask? {

+ 19 - 17
Sources/Image/ImageProgressive.swift

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