我有一个 Parse 数据库,其中包含缩略图的 PFFile 项目(以及其他项目)。该数据库是只读的,并且是使用另一个程序成功创建的。我确认所有缩略图都在 Parse 中。当我尝试使用下面显示的功能检索缩略图时,我在处理所有图像之前收到通知,导致根据通知后处理的时间偶尔失败。我如何确保所有记录都得到处理?
func convertPFilesToImages () {
println("convertPFilesToImages")
let notification = NSNotification(name: "imagesLoaded", object: self)
for i in 0 ..< records.count {
let userImageFile = records[i].icon
records[i].image = UIImage()
println("name: \(self.records[i].name) image: \(self.records[i].image)")
userImageFile.getDataInBackgroundWithBlock {
(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
//println("no error")
if let imageData = imageData {
let image = UIImage(data:imageData)!
self.records[i].image = image
// println below shows that not all images are converted
println("name: \(self.records[i].name) image: \(self.records[i].image)")
}
} else {
println("ParseProcessing-convertToImage: error = \(error)")
}
if (i == self.records.count-1) {
println("All images processed")
// loop is done before all images are processed
NSNotificationCenter.defaultCenter().postNotification(notification)
}
}
}
}
最佳答案
您的 for() 循环执行异步代码,您的问题出在 getDataInBackground
上。
当 i == self.records.count-1
时,它不能保证所有调用都已完成。
getDataInBackround
应该转换为 getData
(或者 Parse 命名为 SYNCHRONOUS 调用),并且您的整个方法应该在后台线程中调用。
你也可以使用 NSOperationQueue
同时加载所有内容,然后调用 [queue waitUntilFinished]
。
关于ios - 使用 Parse 进行异步处理时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828797/