我遇到异步任务问题。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
self.loadRemote {
log.debug("completed remote data")
}
self.loadLocal {
log.debug("completed local data")
}
self.loadAdmin {
log.debug("completed admin data")
}
dispatch_async(dispatch_get_main_queue()) {
log.debug("called completed data")
completed()
}
}
以下代码无法正常工作。它按以下顺序调用:
completed local data
called completed data
completed remote data
这不是我所期望的。您可以想象我想要订单:"本地","远程"最后"称为已完成"。
谢谢!
答案 0 :(得分:8)
这就是Dispatch Groups的用途。你打电话给#34;输入"在开始之前,"离开"当你完成了。然后,您可以添加通知,这是一个在所有操作完成后排队的块。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let group = dispatch_group_create()
dispatch_group_enter(group)
self.loadRemote {
log.debug("completed remote data")
dispatch_group_leave(group)
}
dispatch_group_enter(group)
self.loadLocal {
log.debug("completed local data")
dispatch_group_leave(group)
}
dispatch_group_enter(group)
self.loadAdmin {
log.debug("completed admin data")
dispatch_group_leave(group)
}
dispatch_group_notify(group, dispatch_get_main_queue()) {
log.debug("called completed data")
completed()
}
}
鉴于所有load...
方法似乎都是异步的,这里似乎没有任何理由可以说明dispatch_async
的初始值{但它们可能更耗时当前队列比它们出现的那样)。