Przeglądaj źródła

Merge pull request #1310 from onevcat/fix/lock-performance

Remove taskIdentifier callback lock and call from main
Wei Wang 6 lat temu
rodzic
commit
c7ca382866

+ 0 - 2
Sources/Extensions/ImageView+Kingfisher.swift

@@ -302,8 +302,6 @@ extension KingfisherWrapper where Base: KFCrossPlatformImageView {
     public private(set) var taskIdentifier: Source.Identifier.Value? {
     public private(set) var taskIdentifier: Source.Identifier.Value? {
         get {
         get {
             let box: Box<Source.Identifier.Value>? = getAssociatedObject(base, &taskIdentifierKey)
             let box: Box<Source.Identifier.Value>? = getAssociatedObject(base, &taskIdentifierKey)
-            defer { objc_sync_exit(self) }
-            objc_sync_enter(self)
             return box?.value
             return box?.value
         }
         }
         set {
         set {

+ 0 - 4
Sources/Extensions/NSButton+Kingfisher.swift

@@ -302,8 +302,6 @@ extension KingfisherWrapper where Base: NSButton {
     public private(set) var taskIdentifier: Source.Identifier.Value? {
     public private(set) var taskIdentifier: Source.Identifier.Value? {
         get {
         get {
             let box: Box<Source.Identifier.Value>? = getAssociatedObject(base, &taskIdentifierKey)
             let box: Box<Source.Identifier.Value>? = getAssociatedObject(base, &taskIdentifierKey)
-            defer { objc_sync_exit(self) }
-            objc_sync_enter(self)
             return box?.value
             return box?.value
         }
         }
         set {
         set {
@@ -320,8 +318,6 @@ extension KingfisherWrapper where Base: NSButton {
     public private(set) var alternateTaskIdentifier: Source.Identifier.Value? {
     public private(set) var alternateTaskIdentifier: Source.Identifier.Value? {
         get {
         get {
             let box: Box<Source.Identifier.Value>? = getAssociatedObject(base, &alternateTaskIdentifierKey)
             let box: Box<Source.Identifier.Value>? = getAssociatedObject(base, &alternateTaskIdentifierKey)
-            defer { objc_sync_exit(self) }
-            objc_sync_enter(self)
             return box?.value
             return box?.value
         }
         }
         set {
         set {

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

@@ -323,14 +323,10 @@ extension KingfisherWrapper where Base: UIButton {
     private typealias TaskIdentifier = Box<[UInt: Source.Identifier.Value]>
     private typealias TaskIdentifier = Box<[UInt: Source.Identifier.Value]>
     
     
     public func taskIdentifier(for state: UIControl.State) -> Source.Identifier.Value? {
     public func taskIdentifier(for state: UIControl.State) -> Source.Identifier.Value? {
-        defer { objc_sync_exit(self) }
-        objc_sync_enter(self)
         return taskIdentifierInfo.value[state.rawValue]
         return taskIdentifierInfo.value[state.rawValue]
     }
     }
 
 
     private func setTaskIdentifier(_ identifier: Source.Identifier.Value?, for state: UIControl.State) {
     private func setTaskIdentifier(_ identifier: Source.Identifier.Value?, for state: UIControl.State) {
-        defer { objc_sync_exit(self) }
-        objc_sync_enter(self)
         taskIdentifierInfo.value[state.rawValue] = identifier
         taskIdentifierInfo.value[state.rawValue] = identifier
     }
     }
     
     
@@ -355,14 +351,10 @@ private var backgroundImageTaskKey: Void?
 extension KingfisherWrapper where Base: UIButton {
 extension KingfisherWrapper where Base: UIButton {
     
     
     public func backgroundTaskIdentifier(for state: UIControl.State) -> Source.Identifier.Value? {
     public func backgroundTaskIdentifier(for state: UIControl.State) -> Source.Identifier.Value? {
-        defer { objc_sync_exit(self) }
-        objc_sync_enter(self)
         return backgroundTaskIdentifierInfo.value[state.rawValue]
         return backgroundTaskIdentifierInfo.value[state.rawValue]
     }
     }
     
     
     private func setBackgroundTaskIdentifier(_ identifier: Source.Identifier.Value?, for state: UIControl.State) {
     private func setBackgroundTaskIdentifier(_ identifier: Source.Identifier.Value?, for state: UIControl.State) {
-        defer { objc_sync_exit(self) }
-        objc_sync_enter(self)
         backgroundTaskIdentifierInfo.value[state.rawValue] = identifier
         backgroundTaskIdentifierInfo.value[state.rawValue] = identifier
     }
     }
     
     

+ 0 - 2
Sources/Extensions/WKInterfaceImage+Kingfisher.swift

@@ -178,8 +178,6 @@ extension KingfisherWrapper where Base: WKInterfaceImage {
     public private(set) var taskIdentifier: Source.Identifier.Value? {
     public private(set) var taskIdentifier: Source.Identifier.Value? {
         get {
         get {
             let box: Box<Source.Identifier.Value>? = getAssociatedObject(base, &taskIdentifierKey)
             let box: Box<Source.Identifier.Value>? = getAssociatedObject(base, &taskIdentifierKey)
-            defer { objc_sync_exit(self) }
-            objc_sync_enter(self)
             return box?.value
             return box?.value
         }
         }
         set {
         set {

+ 8 - 8
Sources/General/KingfisherOptionsInfo.swift

@@ -345,15 +345,15 @@ class ImageLoadingProgressSideEffect: DataReceivingSideEffect {
     }
     }
 
 
     func onDataReceived(_ session: URLSession, task: SessionDataTask, data: Data) {
     func onDataReceived(_ session: URLSession, task: SessionDataTask, data: Data) {
-        guard onShouldApply() else { return }
-        guard
-            let expectedContentLength = task.task.response?.expectedContentLength,
-            expectedContentLength != -1 else {
-            return
-        }
-
-        let dataLength = Int64(task.mutableData.count)
         DispatchQueue.main.async {
         DispatchQueue.main.async {
+            guard self.onShouldApply() else { return }
+            guard
+                let expectedContentLength = task.task.response?.expectedContentLength,
+                expectedContentLength != -1 else {
+                return
+            }
+
+            let dataLength = Int64(task.mutableData.count)
             self.block(dataLength, expectedContentLength)
             self.block(dataLength, expectedContentLength)
         }
         }
     }
     }

+ 22 - 15
Sources/Image/ImageProgressive.swift

@@ -64,7 +64,11 @@ final class ImageProgressiveProvider: DataReceivingSideEffect {
     var onShouldApply: () -> Bool = { return true }
     var onShouldApply: () -> Bool = { return true }
     
     
     func onDataReceived(_ session: URLSession, task: SessionDataTask, data: Data) {
     func onDataReceived(_ session: URLSession, task: SessionDataTask, data: Data) {
-        update(data: task.mutableData, with: task.callbacks)
+
+        DispatchQueue.main.async {
+            guard self.onShouldApply() else { return }
+            self.update(data: task.mutableData, with: task.callbacks)
+        }
     }
     }
 
 
     private let option: ImageProgressive
     private let option: ImageProgressive
@@ -88,14 +92,9 @@ 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 }
-        
+
         queue.add(minimum: option.scanInterval) { completion in
         queue.add(minimum: option.scanInterval) { completion in
-            guard self.onShouldApply() else {
-                self.queue.clean()
-                completion()
-                return
-            }
-            
+
             func decode(_ data: Data) {
             func decode(_ data: Data) {
                 self.decoder.decode(data, with: callbacks) { image in
                 self.decoder.decode(data, with: callbacks) { image in
                     defer { completion() }
                     defer { completion() }
@@ -104,12 +103,19 @@ final class ImageProgressiveProvider: DataReceivingSideEffect {
                     self.refresh(image)
                     self.refresh(image)
                 }
                 }
             }
             }
-            
-            if self.option.isFastestScan {
-                decode(self.decoder.scanning(data) ?? Data())
-                
-            } else {
-                self.decoder.scanning(data).forEach { decode($0) }
+
+            CallbackQueue.mainCurrentOrAsync.execute {
+                guard self.onShouldApply() else {
+                    self.queue.clean()
+                    completion()
+                    return
+                }
+
+                if self.option.isFastestScan {
+                    decode(self.decoder.scanning(data) ?? Data())
+                } else {
+                    self.decoder.scanning(data).forEach { decode($0) }
+                }
             }
             }
         }
         }
     }
     }
@@ -250,7 +256,8 @@ private final class ImageProgressiveDecoder {
 private final class ImageProgressiveSerialQueue {
 private final class ImageProgressiveSerialQueue {
     typealias ClosureCallback = ((@escaping () -> Void)) -> Void
     typealias ClosureCallback = ((@escaping () -> Void)) -> Void
     
     
-    private let queue: DispatchQueue = .init(label: "com.onevcat.Kingfisher.ImageProgressive.SerialQueue")
+    private let queue: DispatchQueue = //DispatchQueue.main
+        .init(label: "com.onevcat.Kingfisher.ImageProgressive.SerialQueue")
     private var items: [DispatchWorkItem] = []
     private var items: [DispatchWorkItem] = []
     private var notify: (() -> Void)?
     private var notify: (() -> Void)?
     private var lastTime: TimeInterval?
     private var lastTime: TimeInterval?