onevcat 6 лет назад
Родитель
Сommit
6d5106e482

+ 12 - 8
Demo/Demo/Kingfisher-Demo/ViewControllers/SwiftUIScreens/SwiftUIList.swift

@@ -34,18 +34,22 @@ struct SwiftUIList : View {
 
     var body: some View {
         List(index) { i in
-            KFImage(url: URL(string: "https://raw.githubusercontent.com/onevcat/Kingfisher-TestImages/master/DemoAppImage/Loading/kingfisher-\(i).jpg")!)
-                .resizable()
-                .onSuccess { r in
-                    print("suc: \(i)")
+            HStack(alignment: .center) {
+                Spacer()
+                KFImage(url: URL(string: "https://raw.githubusercontent.com/onevcat/Kingfisher-TestImages/master/DemoAppImage/Loading/kingfisher-\(i).jpg")!)
+                    .resizable()
+                    .onSuccess { r in
+                        print("suc: \(i) - \(r.cacheType)")
                 }
                 .onFailure { e in
                     print("err: \(i)")
                 }
-                .placeholder(image: Image(systemName: "star.fill"))
-                .frame(width: 300, height: 300)
-                .cornerRadius(20)
-        }.navigationBarTitle(Text("Basic Image"))
+                .placeholder(image: Image(systemName: "arrow.2.circlepath.circle"))
+                    .frame(width: 300, height: 300)
+                    .cornerRadius(20)
+                Spacer()
+            }.padding(.vertical, 12)
+        }.navigationBarTitle(Text("SwiftUI List"))
     }
 }
 

+ 4 - 4
Demo/Demo/Kingfisher-Demo/ViewControllers/SwiftUIScreens/SwiftUIMainScreen.swift

@@ -28,12 +28,12 @@ import Kingfisher
 import SwiftUI
 
 @available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
-struct SwiftUIMainScreen : SwiftUI.View {
+struct SwiftUIMainScreen : View {
 
-    var body: some SwiftUI.View {
+    var body: some View {
         List {
-            NavigationButton(destination: SwiftUIView()) { Text("Basic Image") }
-            NavigationButton(destination: SwiftUIList()) { Text("List") }
+            NavigationLink(destination: SwiftUIView()) { Text("Basic Image") }
+            NavigationLink(destination: SwiftUIList()) { Text("List") }
         }
     }
 }

+ 16 - 16
Sources/SwiftUI/ImageBinder.swift

@@ -29,20 +29,16 @@ import SwiftUI
 
 @available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
 extension KFImage {
+
     public class ImageBinder: BindableObject {
         let url: URL
 
         public var didChange = PassthroughSubject<KFCrossPlatformImage?, Never>()
         var subject = PassthroughSubject<RetrieveImageResult, KingfisherError>()
-
-        var subscriber: Subscribers.Sink<PassthroughSubject<RetrieveImageResult, KingfisherError>>?
-
         var downloadTask: DownloadTask?
 
         var image: Kingfisher.KFCrossPlatformImage? {
-            didSet {
-                didChange.send(image)
-            }
+            didSet { didChange.send(image) }
         }
 
         init(url: URL) {
@@ -50,21 +46,25 @@ extension KFImage {
         }
 
         func start() {
-            downloadTask = KingfisherManager.shared.retrieveImage(with: .network(url)) { r in
-                switch r {
-                case .success(let result):
-                    self.image = result.image
-                    self.subject.send(result)
-                    self.subject.send(completion: .finished)
-                case .failure(let error):
-                    self.subject.send(completion: .failure(error))
+            let source = Source.network(url)
+            downloadTask = KingfisherManager.shared
+                .retrieveImage(with: source) { [weak self] result in
+                    guard let self = self else { return }
+
+                    self.downloadTask = nil
+                    switch result {
+                    case .success(let value):
+                        self.image = value.image
+                        self.subject.send(value)
+                        self.subject.send(completion: .finished)
+                    case .failure(let error):
+                        self.subject.send(completion: .failure(error))
+                    }
                 }
-            }
         }
 
         public func cancel() {
             downloadTask?.cancel()
         }
     }
-
 }

+ 4 - 6
Sources/SwiftUI/KFImage.swift

@@ -29,6 +29,7 @@ import Combine
 
 @available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
 extension Image {
+    // Creates an SwiftUI.Image with either UIImage or NSImage.
     init(crossPlatformImage: KFCrossPlatformImage) {
         #if canImport(UIKit)
         self.init(uiImage: crossPlatformImage)
@@ -56,21 +57,18 @@ public struct KFImage: View {
     }
 
     public var body: some View {
-        print("Loading body \(binder.url)")
         let image = binder.image.map { Image(crossPlatformImage: $0) } ?? placeholder
         return configs
             .reduce(image) { current, config in config(current) }
             .onAppear { [unowned binder] in
-                binder.subscriber?.cancel()
-                binder.subscriber = binder.subject.sink(
+                _ = binder.subject.sink(
                     receiveCompletion: { complete in
                         switch complete {
                         case .failure(let error):
                             self.onFailureDelegate.call(error)
-                        case .finished: break
+                        case .finished:
+                            break
                         }
-                        binder.subscriber?.cancel()
-                        binder.subscriber = nil
                     },
                     receiveValue: { result in
                         self.onSuccessDelegate.call(result)