【问题标题】:How do I append all Images to this array after Network call?网络调用后如何将所有图像附加到此数组?
【发布时间】:2016-04-18 00:02:32
【问题描述】:

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

【问题讨论】:

    标签: ios arrays json swift


    【解决方案1】:

    iOS 集合和表格视图不会像 HTML 表格那样在加载视图时加载所有单元格。你拥有的那条线

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("imageReuseCell", forIndexPath: indexPath) as! ImageCollectionViewCell

    使可重用单元出列就是这样做的。每 N 个单元格(通常为 tableview 大约 20-30 个)被回收,因此 UI 元素在加载大量数据时保持内存效率。

    为了一次加载所有图像,您必须在 viewDidLoad 回调中开始加载 arrayToHoldConvertedUrlToUIImages 数组中的所有图像 url 并缓存结果(AFnetworking/Alamofire 有很好的缓存组件)。然后,从缓存中加载集合视图单元格中的图像,您的滚动用户体验将更加流畅。

    但是,如果您有很多图像,我建议您不要使用此缓存路线,因为您可能会导致应用程序崩溃。

    【讨论】:

    • 您能否提供一个适用于我的代码示例?我只有 12 个可以转换为图片的网址!我太迷路了!谢谢!我还必须将该数组传递给另一个视图。
    • 非常感谢。我仍然有点困惑。如何让数组充满转换后的 url 到 UIImages?那么我可以对他们做我选择的事情吗?抱歉,我对此很陌生!
    • 一旦你缓存了数据(NSData),你可以像这样将它加载到图像视图中 --> imageView.image = UIImage(data: imageData)
    【解决方案2】:

    在要点中,cacheImages 方法将首先检查图像是否存在于缓存中(显然不存在),然后以二进制形式将其下载到缓存中。然后,在下载完所有图像并刷新集合视图后,单元格将从缓存中分配图像,并且由于它已经在内存中,因此它将快速加载。

    【讨论】:

    • 如何将这个下载的 UUImage 数组传递到下一个视图?谢谢!一些代码会很棒!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2023-01-22
    相关资源
    最近更新 更多