如何等待第一次派遣完成执行

时间:2016-03-21 21:23:26

标签: ios swift

我有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 */
}

我希望第二次调度等到第一次完成执行。我怎么能这样做?

提前感谢

1 个答案:

答案 0 :(得分:1)

我会按照日益复杂的顺序给出一些解决方案:

1

最简单的方法是在同一个异步调用中包含两个代码块:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    // code block 1

    // code block 2
}

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
}

3

如果您的代码块异步运行,例如首先进行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()
}

4

对于任何更复杂的事情,我强烈建议你学习NSOpereationQueue。它上面有一个WWDC session

相关问题