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

Simplify identifier setting and adopt for button types

onevcat 1 год назад
Родитель
Сommit
3479f01e56

+ 14 - 16
Sources/Extensions/HasImageComponent+Kingfisher.swift

@@ -92,9 +92,9 @@ struct ImagePropertyAccessor<ImageType>: Sendable {
     let getImage: @Sendable @MainActor () -> ImageType?
     let getImage: @Sendable @MainActor () -> ImageType?
 }
 }
 
 
-struct TaskPropertyAccessor<TaskIdentifierKey>: Sendable {
-    let setTaskIdentifier: @Sendable @MainActor (TaskIdentifierKey?, Source.Identifier.Value?) -> Void
-    let getTaskIdentifier: @Sendable @MainActor (TaskIdentifierKey?) -> Source.Identifier.Value?
+struct TaskPropertyAccessor: Sendable {
+    let setTaskIdentifier: @Sendable @MainActor (Source.Identifier.Value?) -> Void
+    let getTaskIdentifier: @Sendable @MainActor () -> Source.Identifier.Value?
     let setTask: @Sendable @MainActor (DownloadTask?) -> Void
     let setTask: @Sendable @MainActor (DownloadTask?) -> Void
 }
 }
 
 
@@ -366,14 +366,12 @@ extension KingfisherWrapper where Base: KingfisherImageSettable {
                 setImage: { base.setImage($0, options: $1) },
                 setImage: { base.setImage($0, options: $1) },
                 getImage: { base.getImage() }
                 getImage: { base.getImage() }
             ),
             ),
-            taskAccessor: TaskPropertyAccessor<Void>(
-                setTaskIdentifier: { _, value in
+            taskAccessor: TaskPropertyAccessor(
+                setTaskIdentifier: {
                     var mutatingSelf = self
                     var mutatingSelf = self
-                    mutatingSelf.taskIdentifier = value
+                    mutatingSelf.taskIdentifier = $0
                 },
                 },
-                getTaskIdentifier: { _ in
-                    self.taskIdentifier
-                }, 
+                getTaskIdentifier: { self.taskIdentifier },
                 setTask: { task in
                 setTask: { task in
                     var mutatingSelf = self
                     var mutatingSelf = self
                     mutatingSelf.imageTask = task
                     mutatingSelf.imageTask = task
@@ -389,10 +387,10 @@ extension KingfisherWrapper where Base: KingfisherImageSettable {
 
 
 @MainActor
 @MainActor
 extension KingfisherWrapper {
 extension KingfisherWrapper {
-    func setImage<TaskIdentifierKey>(
+    func setImage(
         with source: Source?,
         with source: Source?,
         imageAccessor: ImagePropertyAccessor<KFCrossPlatformImage>,
         imageAccessor: ImagePropertyAccessor<KFCrossPlatformImage>,
-        taskAccessor: TaskPropertyAccessor<TaskIdentifierKey>,
+        taskAccessor: TaskPropertyAccessor,
         placeholder: KFCrossPlatformImage? = nil,
         placeholder: KFCrossPlatformImage? = nil,
         parsedOptions: KingfisherParsedOptionsInfo,
         parsedOptions: KingfisherParsedOptionsInfo,
         progressBlock: DownloadProgressBlock? = nil,
         progressBlock: DownloadProgressBlock? = nil,
@@ -401,7 +399,7 @@ extension KingfisherWrapper {
     {
     {
         guard let source = source else {
         guard let source = source else {
             imageAccessor.setImage(placeholder, parsedOptions)
             imageAccessor.setImage(placeholder, parsedOptions)
-            taskAccessor.setTaskIdentifier(nil, nil)
+            taskAccessor.setTaskIdentifier(nil)
             completionHandler?(.failure(KingfisherError.imageSettingError(reason: .emptySource)))
             completionHandler?(.failure(KingfisherError.imageSettingError(reason: .emptySource)))
             return nil
             return nil
         }
         }
@@ -419,7 +417,7 @@ extension KingfisherWrapper {
         }
         }
 
 
         let issuedIdentifier = Source.Identifier.next()
         let issuedIdentifier = Source.Identifier.next()
-        taskAccessor.setTaskIdentifier(nil, issuedIdentifier)
+        taskAccessor.setTaskIdentifier(issuedIdentifier)
 
 
         if let block = progressBlock {
         if let block = progressBlock {
             options.onDataReceived = (options.onDataReceived ?? []) + [ImageLoadingProgressSideEffect(block)]
             options.onDataReceived = (options.onDataReceived ?? []) + [ImageLoadingProgressSideEffect(block)]
@@ -432,10 +430,10 @@ extension KingfisherWrapper {
                 Task { @MainActor in taskAccessor.setTask(task) }
                 Task { @MainActor in taskAccessor.setTask(task) }
             },
             },
             progressiveImageSetter: { imageAccessor.setImage($0, options) },
             progressiveImageSetter: { imageAccessor.setImage($0, options) },
-            referenceTaskIdentifierChecker: { issuedIdentifier == taskAccessor.getTaskIdentifier(nil) },
+            referenceTaskIdentifierChecker: { issuedIdentifier == taskAccessor.getTaskIdentifier() },
             completionHandler: { result in
             completionHandler: { result in
                 CallbackQueueMain.currentOrAsync {
                 CallbackQueueMain.currentOrAsync {
-                    guard issuedIdentifier == taskAccessor.getTaskIdentifier(nil) else {
+                    guard issuedIdentifier == taskAccessor.getTaskIdentifier() else {
                         let reason: KingfisherError.ImageSettingErrorReason
                         let reason: KingfisherError.ImageSettingErrorReason
                         do {
                         do {
                             let value = try result.get()
                             let value = try result.get()
@@ -449,7 +447,7 @@ extension KingfisherWrapper {
                     }
                     }
 
 
                     taskAccessor.setTask(nil)
                     taskAccessor.setTask(nil)
-                    taskAccessor.setTaskIdentifier(nil, nil)
+                    taskAccessor.setTaskIdentifier(nil)
 
 
                     switch result {
                     switch result {
                     case .success(let value):
                     case .success(let value):

+ 9 - 18
Sources/Extensions/NSButton+Kingfisher.swift

@@ -116,15 +116,10 @@ extension KingfisherWrapper where Base: NSButton {
                 }, getImage: {
                 }, getImage: {
                     base.image
                     base.image
                 }),
                 }),
-            taskAccessor: TaskPropertyAccessor<Void>(
-                setTaskIdentifier: { _, id in
-                    mutatingSelf.taskIdentifier = id
-                },
-                getTaskIdentifier: { _ in
-                    mutatingSelf.taskIdentifier
-                }, setTask: { task in
-                    mutatingSelf.imageTask = task
-                }),
+            taskAccessor: TaskPropertyAccessor(
+                setTaskIdentifier: { mutatingSelf.taskIdentifier = $0 },
+                getTaskIdentifier: { mutatingSelf.taskIdentifier }, 
+                setTask: { mutatingSelf.imageTask = $0 }),
             placeholder: placeholder,
             placeholder: placeholder,
             parsedOptions: parsedOptions,
             parsedOptions: parsedOptions,
             progressBlock: progressBlock,
             progressBlock: progressBlock,
@@ -210,15 +205,11 @@ extension KingfisherWrapper where Base: NSButton {
                 }, getImage: {
                 }, getImage: {
                     base.alternateImage
                     base.alternateImage
                 }),
                 }),
-            taskAccessor: TaskPropertyAccessor<Void>(
-                setTaskIdentifier: { _, id in
-                    mutatingSelf.alternateTaskIdentifier = id
-                },
-                getTaskIdentifier: { _ in
-                    mutatingSelf.alternateTaskIdentifier
-                }, setTask: { task in
-                    mutatingSelf.alternateImageTask = task
-                }),
+            taskAccessor: TaskPropertyAccessor(
+                setTaskIdentifier: { mutatingSelf.alternateTaskIdentifier = $0 },
+                getTaskIdentifier: { mutatingSelf.alternateTaskIdentifier },
+                setTask: { mutatingSelf.alternateImageTask = $0 }
+            ),
             placeholder: placeholder,
             placeholder: placeholder,
             parsedOptions: parsedOptions,
             parsedOptions: parsedOptions,
             progressBlock: progressBlock,
             progressBlock: progressBlock,

+ 31 - 121
Sources/Extensions/UIButton+Kingfisher.swift

@@ -114,69 +114,23 @@ extension KingfisherWrapper where Base: UIButton {
         progressBlock: DownloadProgressBlock? = nil,
         progressBlock: DownloadProgressBlock? = nil,
         completionHandler: (@MainActor @Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)? = nil) -> DownloadTask?
         completionHandler: (@MainActor @Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)? = nil) -> DownloadTask?
     {
     {
-        guard let source = source else {
-            base.setImage(placeholder, for: state)
-            setTaskIdentifier(nil, for: state)
-            completionHandler?(.failure(KingfisherError.imageSettingError(reason: .emptySource)))
-            return nil
-        }
-
-        var options = parsedOptions
-        if !options.keepCurrentImageWhileLoading {
-            base.setImage(placeholder, for: state)
-        }
-
         var mutatingSelf = self
         var mutatingSelf = self
-        let issuedIdentifier = Source.Identifier.next()
-        setTaskIdentifier(issuedIdentifier, for: state)
-
-        if let block = progressBlock {
-            options.onDataReceived = (options.onDataReceived ?? []) + [ImageLoadingProgressSideEffect(block)]
-        }
-
-        let task = KingfisherManager.shared.retrieveImage(
+        return setImage(
             with: source,
             with: source,
-            options: options,
-            downloadTaskUpdated: { task in
-                Task { @MainActor in mutatingSelf.imageTask = task }
-            },
-            progressiveImageSetter: { self.base.setImage($0, for: state) },
-            referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier(for: state) },
-            completionHandler: { result in
-                CallbackQueueMain.currentOrAsync {
-                    guard issuedIdentifier == self.taskIdentifier(for: state) else {
-                        let reason: KingfisherError.ImageSettingErrorReason
-                        do {
-                            let value = try result.get()
-                            reason = .notCurrentSourceTask(result: value, error: nil, source: source)
-                        } catch {
-                            reason = .notCurrentSourceTask(result: nil, error: error, source: source)
-                        }
-                        let error = KingfisherError.imageSettingError(reason: reason)
-                        completionHandler?(.failure(error))
-                        return
-                    }
-
-                    mutatingSelf.imageTask = nil
-                    mutatingSelf.setTaskIdentifier(nil, for: state)
-
-                    switch result {
-                    case .success(let value):
-                        self.base.setImage(value.image, for: state)
-                        completionHandler?(result)
-
-                    case .failure:
-                        if let image = options.onFailureImage {
-                            self.base.setImage(image, for: state)
-                        }
-                        completionHandler?(result)
-                    }
-                }
-            }
+            imageAccessor: ImagePropertyAccessor(
+                setImage: { image, _ in base.setImage(image, for: state) },
+                getImage: { base.image(for: state) }
+            ),
+            taskAccessor: TaskPropertyAccessor(
+                setTaskIdentifier: { setTaskIdentifier($0, for: state) },
+                getTaskIdentifier: { taskIdentifier(for: state) },
+                setTask: { mutatingSelf.imageTask = $0 }
+            ),
+            placeholder: placeholder,
+            parsedOptions: parsedOptions,
+            progressBlock: progressBlock,
+            completionHandler: completionHandler
         )
         )
-
-        mutatingSelf.imageTask = task
-        return task
     }
     }
 
 
     // MARK: Cancelling Downloading Task
     // MARK: Cancelling Downloading Task
@@ -269,71 +223,27 @@ extension KingfisherWrapper where Base: UIButton {
         progressBlock: DownloadProgressBlock? = nil,
         progressBlock: DownloadProgressBlock? = nil,
         completionHandler: (@MainActor @Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)? = nil) -> DownloadTask?
         completionHandler: (@MainActor @Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)? = nil) -> DownloadTask?
     {
     {
-        guard let source = source else {
-            base.setBackgroundImage(placeholder, for: state)
-            setBackgroundTaskIdentifier(nil, for: state)
-            completionHandler?(.failure(KingfisherError.imageSettingError(reason: .emptySource)))
-            return nil
-        }
-
-        var options = parsedOptions
-        if !options.keepCurrentImageWhileLoading {
-            base.setBackgroundImage(placeholder, for: state)
-        }
-
         var mutatingSelf = self
         var mutatingSelf = self
-        let issuedIdentifier = Source.Identifier.next()
-        setBackgroundTaskIdentifier(issuedIdentifier, for: state)
-
-        if let block = progressBlock {
-            options.onDataReceived = (options.onDataReceived ?? []) + [ImageLoadingProgressSideEffect(block)]
-        }
-
-        let task = KingfisherManager.shared.retrieveImage(
+        return setImage(
             with: source,
             with: source,
-            options: options,
-            downloadTaskUpdated: { task in
-                Task { @MainActor in
-                    mutatingSelf.backgroundImageTask = task
-                }
-            },
-            progressiveImageSetter: { self.base.setBackgroundImage($0, for: state) },
-            referenceTaskIdentifierChecker: { issuedIdentifier == self.backgroundTaskIdentifier(for: state) },
-            completionHandler: { result in
-                CallbackQueueMain.currentOrAsync {
-                    guard issuedIdentifier == self.backgroundTaskIdentifier(for: state) else {
-                        let reason: KingfisherError.ImageSettingErrorReason
-                        do {
-                            let value = try result.get()
-                            reason = .notCurrentSourceTask(result: value, error: nil, source: source)
-                        } catch {
-                            reason = .notCurrentSourceTask(result: nil, error: error, source: source)
-                        }
-                        let error = KingfisherError.imageSettingError(reason: reason)
-                        completionHandler?(.failure(error))
-                        return
-                    }
-
-                    mutatingSelf.backgroundImageTask = nil
-                    mutatingSelf.setBackgroundTaskIdentifier(nil, for: state)
-
-                    switch result {
-                    case .success(let value):
-                        self.base.setBackgroundImage(value.image, for: state)
-                        completionHandler?(result)
-
-                    case .failure:
-                        if let image = options.onFailureImage {
-                            self.base.setBackgroundImage(image, for: state)
-                        }
-                        completionHandler?(result)
-                    }
+            imageAccessor: ImagePropertyAccessor(
+                setImage: { image, _ in
+                    base.setBackgroundImage(image, for: state)
+                },
+                getImage: {
+                    base.backgroundImage(for: state)
                 }
                 }
-            }
+            ),
+            taskAccessor: TaskPropertyAccessor(
+                setTaskIdentifier: { setBackgroundTaskIdentifier($0, for: state) },
+                getTaskIdentifier: { backgroundTaskIdentifier(for: state) },
+                setTask: { mutatingSelf.backgroundImageTask = $0 }
+            ),
+            placeholder: placeholder,
+            parsedOptions: parsedOptions,
+            progressBlock: progressBlock,
+            completionHandler: completionHandler
         )
         )
-
-        mutatingSelf.backgroundImageTask = task
-        return task
     }
     }
 
 
     // MARK: Cancelling Background Downloading Task
     // MARK: Cancelling Background Downloading Task