如何在网络呼叫后将所有图像附加到此阵列?

时间:2016-04-18 00:02:33

标签: ios arrays json swift

我正在将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
    }

2 个答案:

答案 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方法将首先检查图像,然后以二进制形式将其下载到缓存中。然后,在下载所有图像并刷新集合视图后,单元格将从缓存中分配图像,因为它已经在内存中,所以它将快速加载。