首页 > 解决方案 > 如何使用 getDataInBackground 将整个 PFFile 数组转换为 UIImage 数组

问题描述

我正在将 PFFile(图像)加载到表视图中,我想知道如何getDataInBackground处理数组,而不会浪费任何东西(内存或其他东西,我不知道)。这意味着以一种有效的方式将 PFFile 数组转换为 UIImage 数组。

我试过这个:

   self.UIImagesArray.removeAll(keepingCapacity: false)

   for i in 0..<self.imagesArray.count { // imagesArray is a PFFile array     
        imagesArray[i].getDataInBackground(block: { (data, error) in
            if error != nil {
                print(error?.localizedDescription)
            } else {      
                if let imageData = data {
                    if let imageToDisplay = UIImage(data: imageData) {
                        self.UIImagesArray.append(imageToDisplay)
                    }
                }
            }

            if self.imagesArray.count == self.UIImagesArray.count {
                self.tableView.reloadData()
            }
        })
    }

我相信我无法向你解释结果,因为我觉得我的 UIImages 数组是随机填充的,所以每次我实现我的表格视图时,每个单元格的图片总是/大部分时间不同。

我很高兴能得到一些帮助。

标签: iosswift

解决方案


您看到的顺序取决于下载每个图像所需的时间。您需要做的是将接收到的图像与其索引一起存储,然后将所有图像组装好后,以正确的顺序将它们转换回数组:

self.UIImagesArray.removeAll(keepingCapacity: false)

for i in 0 .. <self.imagesArray.count { // imagesArray is a PFFile array
    var imgDict = [Int: UIImage]()
    imagesArray[i].getDataInBackground(block: { (data, error) in
        if error != nil {
            print(error?.localizedDescription)
        } else {
            if let imageData = data {
                if let imageToDisplay = UIImage(data: imageData) {
                    imgDict[i] = imageToDisplay
                }
            }
        }

        if self.imgDict.count == self.imagesArray.count {
            self.UIImagesArray = imgDict.keys.sorted().compactMap { imgDict[$0] }

            self.tableView.reloadData()
        }

    })
}

推荐阅读