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 来说是相同的。)