我目前正在 Xcode 10 Playground (Swift 5) 中测试这段代码:
func one() {
let test = "bla"
two(test, completion: { (returned) in
print(returned)
})
}
func two(_ test: String, completion: @escaping (_ returned: String?) -> Void) {
DispatchQueue.global(qos:.background).async {
if !test.isEmpty {
//Some slow stuff
DispatchQueue.main.async {
return completion("hi!")
}
}
//Also some slow stuff
DispatchQueue.main.async {
return completion(nil) //can't have this in "else"!
}
}
}
one()
问题是“hi”和“nil”都被打印出来了。
如果我摆脱线程,它可以正常工作,但它似乎DispatchQueue.main.async
在第一个有机会返回之前到达第二个。
在我的实际代码中的“一些缓慢的东西”中还有很多东西在发生,if
但我不能依赖在调用第二次返回之前花费足够长的时间来返回。
我该如何做到这一点:让函数在后台线程中运行,但在主线程上只返回一次(就像通常没有线程的代码一样)?