ios - 如何使用 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 数组是随机填充的,所以每次我实现我的表格视图时,每个单元格的图片总是/大部分时间不同。
我很高兴能得到一些帮助。
解决方案
您看到的顺序取决于下载每个图像所需的时间。您需要做的是将接收到的图像与其索引一起存储,然后将所有图像组装好后,以正确的顺序将它们转换回数组:
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()
}
})
}
推荐阅读
- android - 生成 APK 时 QtCreator 发生 ProcessException
- xslt - 通过 XPath 提取元素节点?
- c# - 为什么 .net 显示相同 nuget 包的版本冲突,这是 3rd 方库/包的内部依赖项?
- arrays - 如何从 json 中删除索引 - 使用 laravel
- java - 使用注入的 Spring Boot DI。无法识别的类
- java - android.widget.Toolbar 和 android.support.v7.widget.Toolbar 有什么区别?
- python - 如何按值正确地将对象传递给函数
- joomla - 有什么方法可以手动将 Joomla 中的新注册用户发送到 Mautic?
- javascript - 如何使用 JavaScript append 插入带有样式属性的选项值?
- mysql - 有没有办法通过更改连接点来运行带有 MySql 数据库的 DNN 9?