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

Fix cancelling indicator animating

onevcat 8 лет назад
Родитель
Сommit
b13be3a140
2 измененных файлов с 23 добавлено и 16 удалено
  1. 1 2
      Sources/ImageView+Kingfisher.swift
  2. 22 14
      Sources/Indicator.swift

+ 1 - 2
Sources/ImageView+Kingfisher.swift

@@ -95,6 +95,7 @@ extension Kingfisher where Base: ImageView {
             },
             completionHandler: {[weak base] image, error, cacheType, imageURL in
                 DispatchQueue.main.safeAsync {
+                    maybeIndicator?.stopAnimatingView()
                     guard let strongBase = base, imageURL == self.webURL else {
                         completionHandler?(image, error, cacheType, imageURL)
                         return
@@ -102,7 +103,6 @@ extension Kingfisher where Base: ImageView {
                     
                     self.setImageTask(nil)
                     guard let image = image else {
-                        maybeIndicator?.stopAnimatingView()
                         completionHandler?(nil, error, cacheType, imageURL)
                         return
                     }
@@ -110,7 +110,6 @@ extension Kingfisher where Base: ImageView {
                     guard let transitionItem = options.lastMatchIgnoringAssociatedValue(.transition(.none)),
                         case .transition(let transition) = transitionItem, ( options.forceTransition || cacheType == .none) else
                     {
-                        maybeIndicator?.stopAnimatingView()
                         strongBase.image = image
                         completionHandler?(image, error, cacheType, imageURL)
                         return

+ 22 - 14
Sources/Indicator.swift

@@ -86,34 +86,42 @@ extension Indicator {
 
 // MARK: - ActivityIndicator
 // Displays a NSProgressIndicator / UIActivityIndicatorView
-struct ActivityIndicator: Indicator {
+class ActivityIndicator: Indicator {
 
     #if os(macOS)
     private let activityIndicatorView: NSProgressIndicator
     #else
     private let activityIndicatorView: UIActivityIndicatorView
     #endif
+    private var animatingCount = 0
 
     var view: IndicatorView {
         return activityIndicatorView
     }
 
     func startAnimatingView() {
-        #if os(macOS)
-            activityIndicatorView.startAnimation(nil)
-        #else
-            activityIndicatorView.startAnimating()
-        #endif
-        activityIndicatorView.isHidden = false
+        animatingCount += 1
+        // Alrady animating
+        if animatingCount == 1 {
+            #if os(macOS)
+                activityIndicatorView.startAnimation(nil)
+            #else
+                activityIndicatorView.startAnimating()
+            #endif
+            activityIndicatorView.isHidden = false
+        }
     }
 
     func stopAnimatingView() {
-        #if os(macOS)
-            activityIndicatorView.stopAnimation(nil)
-        #else
-            activityIndicatorView.stopAnimating()
-        #endif
-        activityIndicatorView.isHidden = true
+        animatingCount = max(animatingCount - 1, 0)
+        if animatingCount == 0 {
+            #if os(macOS)
+                activityIndicatorView.stopAnimation(nil)
+            #else
+                activityIndicatorView.stopAnimating()
+            #endif
+            activityIndicatorView.isHidden = true
+        }
     }
 
     init() {
@@ -135,7 +143,7 @@ struct ActivityIndicator: Indicator {
 
 // MARK: - ImageIndicator
 // Displays an ImageView. Supports gif
-struct ImageIndicator: Indicator {
+class ImageIndicator: Indicator {
     private let animatedImageIndicatorView: ImageView
 
     var view: IndicatorView {