完成处理程序? async_dispatch?
Completion handler? async_dispatch?
这些是需要发生的方法和过程:
- 从 Parse 下载图片
- 下载关联数据(匹配图像)
- 在地图上绘制此数据
这是我从视图加载的代码:
override func viewDidLoad() {
imageDownload { () -> () in
print("5-----inside closure")
self.queryParseandSave(callback: self.plotImages)
}
}
图片下载功能:
func imageDownload(completed: @escaping FinishedDownload){
print("1-----Started Image download")
// Query for places
let query = PFQuery(className:"ViewFinderObjects")
query.whereKey("ImageVerified", equalTo: true)
query.whereKey("coordinates", nearGeoPoint:myGeoPoint)
query.limit = 10
query.findObjectsInBackground { (objects, error) -> Void in
if (error == nil) {
for object in objects! {
print("2-----inside object for block")
let imageFromParse = object["image"] as! PFFile
imageFromParse.getDataInBackground(block: {(imageData, error) -> Void in
print("Searching for Image")
if error == nil {
let obsImage:UIImage = UIImage(data: imageData!)!
self.imageToShow = obsImage
self.closestImage.append(self.imageToShow!)
print("There are \(self.closestImage.count) images in the image array")
}
})
print("3-----Completed object loop")
}
}
print("4-----Calling completed statement")
completed()
}
}
然后调用另一个函数queryParseandSave(callback: self.plotImages)
self.plotImages
在地图上绘制图像。
我有 1 个大问题:
self.plotImahes
总是在图片下载完成之前被调用
我研究过 async_dispatch 但不知道这样做是否正确。
我不熟悉 query.findObjectsInBackground
和 imageFromParse.getDataInBackground
方法的实现,但它们的命名暗示它们都是异步发生的。另外从上面提供的内容来看,前者检索对象数据,而后者下载实际的图像数据。如果确实如此,那么您似乎是在 first 异步方法的主体内调用完成处理程序,而不是等待第二个方法(看起来是实际的图片下载)。
关于如何解决这个问题的几个想法:
- 您可以将完成处理程序移动到
imageFromParse.getDataInBackground
块中,但这只有在您愿意在每个图像下载完成后多次调用完成块时才有意义。
- 您可以创建自己的调度或操作队列并等待所有任务完成,然后调用完成处理程序。
- 您可以设置一个观察者或通知模式,在适当的时候调用您的完成处理程序。
有许多不同的方法可以解决这个问题,但要记住的关键是,听起来您想在 所有异步操作之后调用完成处理程序完全的。现在您正在检索对象后调用它,但是当您的完成处理程序被调用时,您的所有图像仍在后台下载。
这些是需要发生的方法和过程:
- 从 Parse 下载图片
- 下载关联数据(匹配图像)
- 在地图上绘制此数据
这是我从视图加载的代码:
override func viewDidLoad() {
imageDownload { () -> () in
print("5-----inside closure")
self.queryParseandSave(callback: self.plotImages)
}
}
图片下载功能:
func imageDownload(completed: @escaping FinishedDownload){
print("1-----Started Image download")
// Query for places
let query = PFQuery(className:"ViewFinderObjects")
query.whereKey("ImageVerified", equalTo: true)
query.whereKey("coordinates", nearGeoPoint:myGeoPoint)
query.limit = 10
query.findObjectsInBackground { (objects, error) -> Void in
if (error == nil) {
for object in objects! {
print("2-----inside object for block")
let imageFromParse = object["image"] as! PFFile
imageFromParse.getDataInBackground(block: {(imageData, error) -> Void in
print("Searching for Image")
if error == nil {
let obsImage:UIImage = UIImage(data: imageData!)!
self.imageToShow = obsImage
self.closestImage.append(self.imageToShow!)
print("There are \(self.closestImage.count) images in the image array")
}
})
print("3-----Completed object loop")
}
}
print("4-----Calling completed statement")
completed()
}
}
然后调用另一个函数queryParseandSave(callback: self.plotImages)
self.plotImages
在地图上绘制图像。
我有 1 个大问题:
self.plotImahes
总是在图片下载完成之前被调用
我研究过 async_dispatch 但不知道这样做是否正确。
我不熟悉 query.findObjectsInBackground
和 imageFromParse.getDataInBackground
方法的实现,但它们的命名暗示它们都是异步发生的。另外从上面提供的内容来看,前者检索对象数据,而后者下载实际的图像数据。如果确实如此,那么您似乎是在 first 异步方法的主体内调用完成处理程序,而不是等待第二个方法(看起来是实际的图片下载)。
关于如何解决这个问题的几个想法:
- 您可以将完成处理程序移动到
imageFromParse.getDataInBackground
块中,但这只有在您愿意在每个图像下载完成后多次调用完成块时才有意义。 - 您可以创建自己的调度或操作队列并等待所有任务完成,然后调用完成处理程序。
- 您可以设置一个观察者或通知模式,在适当的时候调用您的完成处理程序。
有许多不同的方法可以解决这个问题,但要记住的关键是,听起来您想在 所有异步操作之后调用完成处理程序完全的。现在您正在检索对象后调用它,但是当您的完成处理程序被调用时,您的所有图像仍在后台下载。