Răsfoiți Sursa

Move TVMonogramView support to extension

onevcat 1 an în urmă
părinte
comite
ad5d1b7371

+ 0 - 4
Kingfisher.xcodeproj/project.pbxproj

@@ -118,7 +118,6 @@
 		D1F1F6FF24625EC600910725 /* RetryStrategyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F1F6FE24625EC600910725 /* RetryStrategyTests.swift */; };
 		D8FCF6A821C5A0E500F9ABC0 /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8FCF6A721C5A0E500F9ABC0 /* RedirectHandler.swift */; };
 		D9638BA61C7DC71F0046523D /* ImagePrefetcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9638BA41C7DC71F0046523D /* ImagePrefetcherTests.swift */; };
-		DCEB2842257E4BE100D7A610 /* TVMonogramView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCEB2841257E4BE100D7A610 /* TVMonogramView+Kingfisher.swift */; };
 		E9E3ED8B2B1F66B200734CFF /* HasImageComponent+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E3ED8A2B1F66B200734CFF /* HasImageComponent+Kingfisher.swift */; };
 		F72CE9CE1FCF17ED00CC522A /* ImageModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72CE9CD1FCF17ED00CC522A /* ImageModifierTests.swift */; };
 /* End PBXBuildFile section */
@@ -296,7 +295,6 @@
 		D1F7607623097532000C5269 /* KFImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KFImage.swift; sourceTree = "<group>"; };
 		D8FCF6A721C5A0E500F9ABC0 /* RedirectHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedirectHandler.swift; sourceTree = "<group>"; };
 		D9638BA41C7DC71F0046523D /* ImagePrefetcherTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImagePrefetcherTests.swift; sourceTree = "<group>"; };
-		DCEB2841257E4BE100D7A610 /* TVMonogramView+Kingfisher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TVMonogramView+Kingfisher.swift"; sourceTree = "<group>"; };
 		E9E3ED8A2B1F66B200734CFF /* HasImageComponent+Kingfisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HasImageComponent+Kingfisher.swift"; sourceTree = "<group>"; };
 		F72CE9CD1FCF17ED00CC522A /* ImageModifierTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageModifierTests.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
@@ -398,7 +396,6 @@
 				D12AB6AD215D2BB50013BA68 /* NSButton+Kingfisher.swift */,
 				E9E3ED8A2B1F66B200734CFF /* HasImageComponent+Kingfisher.swift */,
 				D12AB6AE215D2BB50013BA68 /* UIButton+Kingfisher.swift */,
-				DCEB2841257E4BE100D7A610 /* TVMonogramView+Kingfisher.swift */,
 				22FDCE0D2700078B0044D11E /* CPListItem+Kingfisher.swift */,
 			);
 			path = Extensions;
@@ -874,7 +871,6 @@
 				4B8E291C216F40AA0095FAD1 /* AuthenticationChallengeResponsable.swift in Sources */,
 				3ADE9AF92A73CD69009A86CA /* String+SHA256.swift in Sources */,
 				D12AB710215D2BB50013BA68 /* KingfisherOptionsInfo.swift in Sources */,
-				DCEB2842257E4BE100D7A610 /* TVMonogramView+Kingfisher.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 5 - 13
Sources/Extensions/HasImageComponent+Kingfisher.swift

@@ -30,39 +30,26 @@ public protocol KingfisherHasImageComponent: KingfisherCompatible {
 
 #if canImport(AppKit) && !targetEnvironment(macCatalyst)
 import AppKit
-
 @available(macOS 13.0, *)
 extension NSComboButton: KingfisherHasImageComponent {}
-
 @available(macOS 13.0, *)
 extension NSColorWell: KingfisherHasImageComponent {}
-
 extension NSTableViewRowAction: KingfisherHasImageComponent {}
-
 extension NSMenuItem: KingfisherHasImageComponent {}
-
 extension NSPathControlItem: KingfisherHasImageComponent {}
-
 extension NSToolbarItem: KingfisherHasImageComponent {}
-
 extension NSTabViewItem: KingfisherHasImageComponent {}
-
 extension NSStatusItem: KingfisherHasImageComponent {}
-
 extension NSCell: KingfisherHasImageComponent {}
 #endif
 
 #if canImport(UIKit) && !os(watchOS)
 import UIKit
-
 @available(iOS 13.0, tvOS 13.0, *)
 extension UIAction: KingfisherHasImageComponent {}
-
 @available(iOS 13.0, tvOS 13.0, *)
 extension UICommand: KingfisherHasImageComponent {}
-
 extension UIBarItem: KingfisherHasImageComponent {}
-
 #endif
 
 #if canImport(WatchKit)
@@ -75,6 +62,11 @@ extension WKInterfaceImage: KingfisherHasImageComponent {
 }
 #endif
 
+#if canImport(TVUIKit)
+import TVUIKit
+extension TVMonogramView: KingfisherHasImageComponent {}
+#endif
+
 @MainActor
 extension KingfisherWrapper where Base: KingfisherHasImageComponent {
 

+ 0 - 216
Sources/Extensions/TVMonogramView+Kingfisher.swift

@@ -1,216 +0,0 @@
-//
-//  TVMonogramView+Kingfisher.swift
-//  Kingfisher
-//
-//  Created by Marvin Nazari on 2020-12-07.
-//
-//  Copyright (c) 2020 Wei Wang <onevcat@gmail.com>
-//
-//  Permission is hereby granted, free of charge, to any person obtaining a copy
-//  of this software and associated documentation files (the "Software"), to deal
-//  in the Software without restriction, including without limitation the rights
-//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-//  copies of the Software, and to permit persons to whom the Software is
-//  furnished to do so, subject to the following conditions:
-//
-//  The above copyright notice and this permission notice shall be included in
-//  all copies or substantial portions of the Software.
-//
-//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-//  THE SOFTWARE.
-
-import Foundation
-
-#if canImport(TVUIKit)
-
-import TVUIKit
-
-@MainActor
-@available(tvOS 12.0, *)
-extension KingfisherWrapper where Base: TVMonogramView {
-
-    // MARK: Setting Image
-
-    /// Sets an image to the image view with a source.
-    ///
-    /// - Parameters:
-    ///   - source: The `Source` object contains information about the image.
-    ///   - placeholder: A placeholder to show while retrieving the image from the given `resource`.
-    ///   - options: An options set to define image setting behaviors. See `KingfisherOptionsInfo` for more.
-    ///   - progressBlock: Called when the image downloading progress gets updated. If the response does not contain an
-    ///                    `expectedContentLength`, this block will not be called.
-    ///   - completionHandler: Called when the image retrieved and set finished.
-    /// - Returns: A task represents the image downloading.
-    ///
-    /// - Note:
-    ///
-    /// Internally, this method will use `KingfisherManager` to get the requested source
-    /// Since this method will perform UI changes, you must call it from the main thread.
-    /// Both `progressBlock` and `completionHandler` will be also executed in the main thread.
-    ///
-    @discardableResult
-    public func setImage(
-        with source: Source?,
-        placeholder: KFCrossPlatformImage? = nil,
-        options: KingfisherOptionsInfo? = nil,
-        progressBlock: DownloadProgressBlock? = nil,
-        completionHandler: (@MainActor @Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)? = nil
-    ) -> DownloadTask?
-    {
-        let options = KingfisherParsedOptionsInfo(KingfisherManager.shared.defaultOptions + (options ?? .empty))
-        return setImage(
-            with: source,
-            placeholder: placeholder,
-            parsedOptions: options,
-            progressBlock: progressBlock,
-            completionHandler: completionHandler
-        )
-    }
-
-    func setImage(
-        with source: Source?,
-        placeholder: KFCrossPlatformImage? = nil,
-        parsedOptions: KingfisherParsedOptionsInfo,
-        progressBlock: DownloadProgressBlock? = nil,
-        completionHandler: (@MainActor @Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)? = nil
-    ) -> DownloadTask?
-    {
-        var mutatingSelf = self
-        guard let source = source else {
-            base.image = placeholder
-            mutatingSelf.taskIdentifier = nil
-            completionHandler?(.failure(KingfisherError.imageSettingError(reason: .emptySource)))
-            return nil
-        }
-
-        var options = parsedOptions
-        if !options.keepCurrentImageWhileLoading {
-            base.image = placeholder
-        }
-
-        let issuedIdentifier = Source.Identifier.next()
-        mutatingSelf.taskIdentifier = issuedIdentifier
-
-        if let block = progressBlock {
-            options.onDataReceived = (options.onDataReceived ?? []) + [ImageLoadingProgressSideEffect(block)]
-        }
-
-        let task = KingfisherManager.shared.retrieveImage(
-            with: source,
-            options: options,
-            downloadTaskUpdated: { task in
-                Task { @MainActor in mutatingSelf.imageTask = task }
-            },
-            progressiveImageSetter: { self.base.image = $0 },
-            referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier },
-            completionHandler: { result in
-                CallbackQueueMain.currentOrAsync {
-                    guard issuedIdentifier == self.taskIdentifier 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.taskIdentifier = nil
-
-                    switch result {
-                    case .success(let value):
-                        self.base.image = value.image
-                        completionHandler?(result)
-
-                    case .failure:
-                        if let image = options.onFailureImage {
-                            self.base.image = image
-                        }
-                        completionHandler?(result)
-                    }
-                }
-            }
-        )
-
-        mutatingSelf.imageTask = task
-        return task
-    }
-    
-    /// Sets an image to the image view with a requested resource.
-    ///
-    /// - Parameters:
-    ///   - resource: The `Resource` object contains information about the image.
-    ///   - placeholder: A placeholder to show while retrieving the image from the given `resource`.
-    ///   - options: An options set to define image setting behaviors. See `KingfisherOptionsInfo` for more.
-    ///   - progressBlock: Called when the image downloading progress gets updated. If the response does not contain an
-    ///                    `expectedContentLength`, this block will not be called.
-    ///   - completionHandler: Called when the image retrieved and set finished.
-    /// - Returns: A task represents the image downloading.
-    ///
-    /// - Note:
-    ///
-    /// Internally, this method will use `KingfisherManager` to get the requested resource, from either cache
-    /// or network. Since this method will perform UI changes, you must call it from the main thread.
-    /// Both `progressBlock` and `completionHandler` will be also executed in the main thread.
-    ///
-    @discardableResult
-    public func setImage(
-        with resource: Resource?,
-        placeholder: KFCrossPlatformImage? = nil,
-        options: KingfisherOptionsInfo? = nil,
-        progressBlock: DownloadProgressBlock? = nil,
-        completionHandler: (@MainActor @Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)? = nil
-    ) -> DownloadTask?
-    {
-        return setImage(
-            with: resource?.convertToSource(),
-            placeholder: placeholder,
-            options: options,
-            progressBlock: progressBlock,
-            completionHandler: completionHandler)
-    }
-
-    // MARK: Cancelling Image
-
-    /// Cancel the image download task bounded to the image view if it is running.
-    /// Nothing will happen if the downloading has already finished.
-    public func cancelDownloadTask() {
-        imageTask?.cancel()
-    }
-}
-
-@MainActor private var taskIdentifierKey: Void?
-@MainActor private var imageTaskKey: Void?
-
-// MARK: Properties
-@MainActor
-@available(tvOS 12.0, *)
-extension KingfisherWrapper where Base: TVMonogramView {
-    
-    public private(set) var taskIdentifier: Source.Identifier.Value? {
-        get {
-            let box: Box<Source.Identifier.Value>? = getAssociatedObject(base, &taskIdentifierKey)
-            return box?.value
-        }
-        set {
-            let box = newValue.map { Box($0) }
-            setRetainedAssociatedObject(base, &taskIdentifierKey, box)
-        }
-    }
-
-    private var imageTask: DownloadTask? {
-        get { return getAssociatedObject(base, &imageTaskKey) }
-        set { setRetainedAssociatedObject(base, &imageTaskKey, newValue)}
-    }
-}
-
-#endif