我如何让我的代码等待DispatchQueue中的任务完成?它需要任何CompletionHandler或其他什么吗?
func myFunction() {
var a: Int?
DispatchQueue.main.async {
var b: Int = 3
a = b
}
// wait until the task finishes, then print
print(a) // - this will contain nil, of course, because it
// will execute before the code above
}
我用的是Xcode 8.2,用的是Swift 3。
7条答案
按热度按时间dy1byipe1#
使用
DispatchGroup
来实现这一点。当组的enter()
和leave()
呼叫平衡时,您可以得到通知:或者您可以等待:
注意:
group.wait()
阻塞了当前队列(在您的示例中可能是主队列),因此您必须对另一个队列执行dispatch.async
(如上面的示例代码)以避免死锁。oprakyz72#
在Swift 3中,当
DispatchQueue
完成一个任务时,不需要完成处理程序,而且你可以通过不同的方式来实现你的目标其中一个办法是这样的:
它将等待直到循环完成,但在这种情况下,您的主线程将阻塞。
你也可以这样做:
最后一件事:如果要在使用DispatchQueue完成任务时使用completionHandler,可以使用
DispatchWorkItem
。下面是一个如何使用
DispatchWorkItem
的示例:fwzugrvs3#
Swift 5版本的解决方案
jljoyd4f4#
使用调度组
eh57zj3b5#
在Swift 5.5+中,您可以利用Swift Concurrency,它允许从分派给主线程的闭包返回值
au9on6nz6#
雨燕4
在这些情况下,您可以使用异步函数。当您使用
DispatchGroup()
时,有时可能会发生死锁。ezykj2lf7#
不知何故,上面的dispatchGroup enter()和leave()命令对我的情况不起作用。
虽然在后台线程的while循环中使用sleep(5)对我来说很有用,但我还是留了下来,以防它对其他人有帮助,并且不会干扰我的其他线程。