【发布时间】:2016-08-11 06:47:20
【问题描述】:
我是swift的新手,我正在构建一个从互联网下载图像并显示在UICollectionView中的应用程序,我可以成功实现此功能,但是,您似乎超时滚动屏幕,它再次下载了图像再次,这可能会导致用户的大量数据。我发现我可以使用缓存来解决这个问题,但它不起作用,我认为我做的一切都是正确的,但似乎数据没有存储在缓存中。这是代码,任何人都可以帮我解决这个问题吗?谢谢
var imageCache = [String: UIImage]()
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
extension ViewController: UICollectionViewDataSource {
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 5
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell
Alamofire.request(.GET, "http://localhost:8888/wordpress/wp-json/wp/v2/posts").responseJSON { (response) in
if let jsonFile = response.result.value {
var arrayOfPosts = [Posts]()
for post in jsonFile as! NSArray {
let postObj = Posts()
postObj.postThumbnailUrlString = post.valueForKeyPath("featured_image_thumbnail_url") as! String
arrayOfPosts.append(postObj)
}
let imageUrlString: String = arrayOfPosts[indexPath.row].postThumbnailUrlString
let imageUrl: NSURL = NSURL(string: imageUrlString)!
if let imageFromCache = imageCache[imageUrlString] {
cell.imageView.image = imageFromCache
return
}
let request = NSURLRequest(URL: imageUrl)
let session = NSURLSession.sharedSession()
let dataTask = session.dataTaskWithRequest(request) { (data, response, error) in
let imageToCache = UIImage(data: data!)
imageCache[imageUrlString] = imageToCache
dispatch_async(dispatch_get_main_queue(), {
cell.imageView.image = imageToCache
})
}
dataTask.resume()
}
}
return cell
}}
我还有一个 Posts 类和一个自定义的 collectionviewcell。这个收藏了我很久,真的希望有人能帮我解决这个问题。谢谢!!
【问题讨论】:
-
使用
SDWebImage库下载图片,也会缓存图片。 -
如果您已经在使用 Alamofire,最好考虑使用 AlamofireImage。它们与 SDWebImage 非常相似,有一个
UIImageView扩展,可以进行异步图像检索,它解决了您上面包含的代码中的许多问题。 (例如,它不仅会缓存,还会处理单元格是否被重用于不同的索引路径等。)您可以将上述所有图像检索和缓存代码替换为cell.imageView.af_setImageWithURL方法。 -
我之前试过你说的,因为我已经使用了 Alamofire,但我不知道为什么它和上面的代码做同样的工作。我需要创建缓存来存储数据还是 Alamofire 自动创建它?谢谢,我对swift很陌生~~
-
其实我试过AlamofireImage、Haneke等类似的库,都可以成功下载图片,但是都一样,每次滚动collectionview,图片都会快速向右切换,我认为这是因为它没有缓存图像。我不知道为什么会这样?
标签: swift caching uicollectionview alamofire