Browse Source

Merge pull request #1828 from onevcat/fix/binder-loading-timing

Start loading when evaluating view
Wei Wang 4 years ago
parent
commit
1c27757584
2 changed files with 12 additions and 13 deletions
  1. 10 3
      Sources/SwiftUI/ImageBinder.swift
  2. 2 10
      Sources/SwiftUI/KFImageRenderer.swift

+ 10 - 3
Sources/SwiftUI/ImageBinder.swift

@@ -38,9 +38,10 @@ extension KFImage {
         init() {}
         init() {}
 
 
         var downloadTask: DownloadTask?
         var downloadTask: DownloadTask?
+        private var loading = false
 
 
         var loadingOrSucceeded: Bool {
         var loadingOrSucceeded: Bool {
-            return downloadTask != nil || loadedImage != nil
+            return loading || loadedImage != nil
         }
         }
 
 
         @Published var loaded = false
         @Published var loaded = false
@@ -58,6 +59,8 @@ extension KFImage {
                 return
                 return
             }
             }
 
 
+            loading = true
+            
             progress = .init()
             progress = .init()
             downloadTask = KingfisherManager.shared
             downloadTask = KingfisherManager.shared
                 .retrieveImage(
                 .retrieveImage(
@@ -71,10 +74,13 @@ extension KFImage {
 
 
                         guard let self = self else { return }
                         guard let self = self else { return }
 
 
-                        self.downloadTask = nil
+                        CallbackQueue.mainCurrentOrAsync.execute {
+                            self.downloadTask = nil
+                            self.loading = false
+                        }
+                        
                         switch result {
                         switch result {
                         case .success(let value):
                         case .success(let value):
-
                             CallbackQueue.mainCurrentOrAsync.execute {
                             CallbackQueue.mainCurrentOrAsync.execute {
                                 self.loadedImage = value.image
                                 self.loadedImage = value.image
                                 let animation = context.fadeTransitionDuration(cacheType: value.cacheType)
                                 let animation = context.fadeTransitionDuration(cacheType: value.cacheType)
@@ -110,6 +116,7 @@ extension KFImage {
         func cancel() {
         func cancel() {
             downloadTask?.cancel()
             downloadTask?.cancel()
             downloadTask = nil
             downloadTask = nil
+            loading = false
         }
         }
     }
     }
 }
 }

+ 2 - 10
Sources/SwiftUI/KFImageRenderer.swift

@@ -37,8 +37,8 @@ struct KFImageRenderer<HoldingView> : View where HoldingView: KFImageHoldingView
     let context: KFImage.Context<HoldingView>
     let context: KFImage.Context<HoldingView>
     
     
     var body: some View {
     var body: some View {
-        
-        ZStack {
+        binder.start(context: context)
+        return ZStack {
             context.configurations
             context.configurations
                 .reduce(HoldingView.created(from: binder.loadedImage, context: context)) {
                 .reduce(HoldingView.created(from: binder.loadedImage, context: context)) {
                     current, config in config(current)
                     current, config in config(current)
@@ -52,14 +52,6 @@ struct KFImageRenderer<HoldingView> : View where HoldingView: KFImageHoldingView
                         Color.clear
                         Color.clear
                     }
                     }
                 }
                 }
-                .onAppear { [weak binder = self.binder] in
-                    guard let binder = binder else {
-                        return
-                    }
-                    if !binder.loadingOrSucceeded {
-                        binder.start(context: context)
-                    }
-                }
                 .onDisappear { [weak binder = self.binder] in
                 .onDisappear { [weak binder = self.binder] in
                     guard let binder = binder else {
                     guard let binder = binder else {
                         return
                         return