如何使用getDataInBackground将整个PFFile数组转换为UIImage

时间:2019-04-12 20:00:25

标签: ios swift

我正在将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数组是随机填充的,因此每次实现表格视图时,每个单元格的图片总是/大部分时间是不同的。

很高兴能获得帮助。

1 个答案:

答案 0 :(得分:0)

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

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()
        }

    })
}