我正在将JSON解析为自定义对象。然后我将这些url字符串转换为图像并将其加载到collectionView。问题是我想将所有UIImages附加到一个数组中,但我可以添加的唯一图像来自屏幕/滚动图像。我该如何解决这个问题?这是我的代码
import UIKit
class HomepageCollectionViewController: UICollectionViewController {
var hingeImagesArray = [HingeImage]()
var arrayToHoldConvertedUrlToUIImages = [UIImage]()
var task: NSURLSessionDataTask?
override func viewDidLoad() {
super.viewDidLoad()
// Makes the network call for HingeImages
refreshItems()
}
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return hingeImagesArray.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("imageReuseCell", forIndexPath: indexPath) as! ImageCollectionViewCell
let image = hingeImagesArray[indexPath.row]
if let imageURL = image.imageUrl {
if let url = NSURL(string: imageURL) {
// Request images asynchronously so the collection view does not slow down/lag
self.task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// Check if there is data returned
guard let data = data else {
return
}
// Create an image object from our data and assign it to cell
if let hingeImage = UIImage(data: data){
cell.collectionViewImage.image = hingeImage
//append converted Images to array so we can send them over to next view - only proble in that the only images converted at the ones you scrool to which is retarted
self.arrayToHoldConvertedUrlToUIImages.append(hingeImage)
}
})
})
task?.resume()
}
}
return cell
}
答案 0 :(得分:0)
iOS集合和表视图不会像HTML表一样在视图加载时加载所有单元格。你有的行
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("imageReuseCell", forIndexPath: indexPath) as! ImageCollectionViewCell
将一个可重复使用的单元格出列就是这么做的。每个N个单元格(通常为桌面视图约为20-30个)都是循环使用的,因此UI元素在加载大量数据时保持内存效率。
为了一次加载所有图像,您必须开始在viewDidLoad回调中加载arrayToHoldConvertedUrlToUIImages
数组中的所有图像URL并缓存结果(AFnetworking / Alamofire具有很好的缓存组件)。然后,从缓存中加载集合视图单元格中的图像,您的滚动UX将更加简化。
但是,如果您有大量图片,我建议不要使用此缓存路线,因为您可能会崩溃您的应用。
答案 1 :(得分:0)
在要点中,如果图像存在于缓存中(显然不是),则cacheImages方法将首先检查图像,然后以二进制形式将其下载到缓存中。然后,在下载所有图像并刷新集合视图后,单元格将从缓存中分配图像,因为它已经在内存中,所以它将快速加载。