【发布时间】:2017-07-22 22:58:59
【问题描述】:
在后台线程中我们有:
defer {
cleanup()
}
loadData()
if error {
return
}
processData()
DispatchQueue.main.asyncAfter(deadline: delay) { //Delay = now + 0-2 seconds
updateUI()
}
问题是我们要确保延迟cleanUp() 代码在updateUI() 之后运行。就目前而言,这不会发生,因为updateUI() 运行异步。
我的想法是在延迟期间休眠/阻塞,而不是异步运行。这将在 updateUI() 完成后运行延迟 cleanUp()。
你怎么能做到这一点?还是有更好的办法?
【问题讨论】:
-
你可以
Thread.sleep(),但是这有很严重的代码味道。我们通常希望避免在任何时间段内(或者至少超过几毫秒)阻塞线程(甚至是后台线程)。不用说,永远不要在主线程上sleep。 -
我不太明白你在说什么:你想做一些功能上等同于:
sleep(delay); DispatchQueue.main.async { doStuff() }? -
@joeybladb 我更新了描述以提供更多上下文。
-
我猜
processData是异步的?如果是这样,给它一个完成处理程序闭包参数并从那里调用updateUI。但不要sleep或使用asyncAfter。 -
如果问题只是
updateUI()是异步的,它应该有一个完成块,您可以在其中调用cleanup()。
标签: ios swift asynchronous