Browse Source

Merge pull request #76 from vfn/master

Breaking retain cycles
Wei Wang 10 years ago
parent
commit
2cc88a011a
2 changed files with 14 additions and 9 deletions
  1. 7 2
      Kingfisher/KingfisherManager.swift
  2. 7 7
      Kingfisher/UIImageView+Kingfisher.swift

+ 7 - 2
Kingfisher/KingfisherManager.swift

@@ -153,15 +153,20 @@ public class KingfisherManager {
                     targetCache: targetCache,
                     downloader: downloader)
             } else {
+                let diskTaskCompletionHandler: CompletionHandler = { (image, error, cacheType, imageURL) -> () in
+                    // Break retain cycle created inside diskTask closure below
+                    task.diskRetrieveTask = nil
+                    completionHandler?(image: image, error: error, cacheType: cacheType, imageURL: imageURL)
+                }
                 let diskTask = targetCache.retrieveImageForKey(key, options: options, completionHandler: { (image, cacheType) -> () in
                     if image != nil {
-                        completionHandler?(image: image, error: nil, cacheType:cacheType, imageURL: URL)
+                        diskTaskCompletionHandler(image: image, error: nil, cacheType:cacheType, imageURL: URL)
                     } else {
                         self.downloadAndCacheImageWithURL(URL,
                             forKey: key,
                             retrieveImageTask: task,
                             progressBlock: progressBlock,
-                            completionHandler: completionHandler,
+                            completionHandler: diskTaskCompletionHandler,
                             options: options,
                             targetCache: targetCache,
                             downloader: downloader)

+ 7 - 7
Kingfisher/UIImageView+Kingfisher.swift

@@ -119,14 +119,14 @@ public extension UIImageView {
                     progressBlock(receivedSize: receivedSize, totalSize: totalSize)
                 })
             }
-        }) { (image, error, cacheType, imageURL) -> () in
-            dispatch_async(dispatch_get_main_queue(), { () -> Void in
-                if (imageURL == self.kf_webURL && image != nil) {
-                    self.image = image;
-                }
-                completionHandler?(image: image, error: error, cacheType:cacheType, imageURL: imageURL)
+            }, completionHandler: {[weak self] (image, error, cacheType, imageURL) -> () in
+                dispatch_async(dispatch_get_main_queue(), { () -> Void in
+                    if let sSelf = self where imageURL == sSelf.kf_webURL && image != nil {
+                        sSelf.image = image;
+                    }
+                    completionHandler?(image: image, error: error, cacheType:cacheType, imageURL: imageURL)
+                })
             })
-        }
         
         return task
     }