我有2个dispatch_async(),如下所示:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
/* Code here */
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
/* Code here */
}
我希望第二次调度等到第一次完成执行。我怎么能这样做?
提前感谢
答案 0 :(得分:1)
我会按照日益复杂的顺序给出一些解决方案:
最简单的方法是在同一个异步调用中包含两个代码块:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// code block 1
// code block 2
}
如果您不确切知道它们何时会运行,例如,当用户按下按钮时会触发code block 1
,而当用户按下另一个按钮时会运行code block 2
,请使用串行队列:< / p>
let serialQueue = dispatch_queue_create("mySerialQueue", DISPATCH_QUEUE_SERIAL)
dispatch_async(serialQueue) {
// code block 1
}
dispatch_async(serialQueue) {
// code block 2
}
如果您的代码块异步运行,例如首先进行Web服务调用以进行身份验证,然后再进行第二次调用以获取用户的配置文件,则必须实现等待:
let groupID = dispatch_group_create()
let task1 = session.dataTaskWithRequest(request1) { data, response, error in
// handle the response...
// Tell Grand Central Dispatch that the request is done
dispatch_group_leave(groupID)
}
let task2 = session.dataTaskWithRequest(request2) { data, response, error in
// handle the response...
}
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
dispatch_group_enter(groupID) // Tell GCD task1 is starting
task1.resume()
dispatch_group_wait(groupID, DISPATCH_TIME_FOREVER) // Wait until task1 is done
task2.resume()
}
对于任何更复杂的事情,我强烈建议你学习NSOpereationQueue
。它上面有一个WWDC session