在 Swift 中缓存 collectionViewCell 中的图像?

Mik*_*ong 5 caching ios parse-platform uicollectionviewcell swift

我的 collectionViewCell 中有通过 NSURLRequest 获取和解析的图像,如何缓存这些图像,以便它们不必在视图的每次出现/消失时启动新请求?

这是我获取图像的代码:

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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 collectionView 代码,它将图像解析为 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
    }
Run Code Online (Sandbox Code Playgroud)

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

小智 1

使用 NSCache 和 NSOperationQueue 来管理图像加载。/sf/answers/890532961/有一篇很好的文章概述了该技术(它是 Objective-C,但该技术对于 Swift 来说是相同的。)