Browse Source

Use source as hash id

onevcat 5 years ago
parent
commit
691f1053b4

+ 26 - 0
Sources/General/ImageSource/Source.swift

@@ -80,6 +80,32 @@ public enum Source {
     }
 }
 
+extension Source: Hashable {
+    public static func == (lhs: Source, rhs: Source) -> Bool {
+        switch (lhs, rhs) {
+        case (.network(let r1), .network(let r2)):
+            return r1.cacheKey == r2.cacheKey && r1.downloadURL == r2.downloadURL
+        case (.provider(let p1), .provider(let p2)):
+            return p1.cacheKey == p2.cacheKey && p1.contentURL == p2.contentURL
+        case (.provider(_), .network(_)):
+            return false
+        case (.network(_), .provider(_)):
+            return false
+        }
+    }
+
+    public func hash(into hasher: inout Hasher) {
+        switch self {
+        case .network(let r):
+            hasher.combine(r.cacheKey)
+            hasher.combine(r.downloadURL)
+        case .provider(let p):
+            hasher.combine(p.cacheKey)
+            hasher.combine(p.contentURL)
+        }
+    }
+}
+
 extension Source {
     var asResource: Resource? {
         guard case .network(let resource) = self else {

+ 1 - 1
Sources/SwiftUI/ImageBinder.swift

@@ -33,7 +33,7 @@ extension KFImage {
 
     /// Represents a binder for `KFImage`. It takes responsibility as an `ObjectBinding` and performs
     /// image downloading and progress reporting based on `KingfisherManager`.
-    class ImageBinder: ObservableObject {
+    class ImageBinder {
 
         let source: Source?
         var options = KingfisherParsedOptionsInfo(KingfisherManager.shared.defaultOptions)

+ 3 - 7
Sources/SwiftUI/KFImage.swift

@@ -76,8 +76,6 @@ public struct KFImage: View {
         self.init(source: url?.convertToSource(), options: options, isLoaded: isLoaded)
     }
 
-
-
     /// Creates a Kingfisher compatible image view to load image from the given `Source`.
     /// - Parameters:
     ///   - source: The image `Source` defining where to load the target image.
@@ -89,7 +87,6 @@ public struct KFImage: View {
         self.init(binder: binder)
     }
 
-
     /// Creates a Kingfisher compatible image view to load image from the given `URL`.
     /// - Parameters:
     ///   - source: The image `Source` defining where to load the target image.
@@ -106,7 +103,7 @@ public struct KFImage: View {
 
     public var body: some View {
         KFImageRenderer(context)
-            .id(context.binder.source?.url?.absoluteString ?? "-1")
+            .id(context.binder.source)
     }
 }
 
@@ -129,9 +126,8 @@ extension KFImage {
 @available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
 struct KFImageRenderer: View {
 
-    // TODO: Replace `@ObservedObject` with `@StateObject` once we do not need to support iOS 13.
     /// An image binder that manages loading and cancelling image related task.
-    @ObservedObject private(set) var binder: KFImage.ImageBinder
+    private let binder: KFImage.ImageBinder
 
     @State private var loadingResult: Result<RetrieveImageResult, KingfisherError>?
 
@@ -163,7 +159,7 @@ struct KFImageRenderer: View {
                 if placeholder != nil {
                     placeholder
                 } else {
-                    Image(crossPlatformImage: .init())
+                    Color.clear
                 }
             }
             .onAppear { [weak binder = self.binder] in