Mar*_*eon 0 asynchronous ios swift
在后台线程中,我们有:
defer {
cleanup()
}
loadData()
if error {
return
}
processData()
DispatchQueue.main.asyncAfter(deadline: delay) { //Delay = now + 0-2 seconds
updateUI()
}
Run Code Online (Sandbox Code Playgroud)
问题是我们要确保 defercleanUp()代码在updateUI(). 就目前而言,这不会updateUI()在异步运行时发生。
我的想法是在延迟期间休眠/阻塞,而不是异步运行。这将使延迟cleanUp()运行一次updateUI()完成。
你怎么能做到这一点?或者,还有更好的方法?
您可以使用信号量告诉清理任务等待updateUI完成:
let semaphore = DispatchSemaphore(value: 1)
defer {
semaphore.wait()
cleanup()
}
loadData()
if error {
// If we exit here, the semaphore would have never been used
// and cleanup will run immediately
return
}
processData()
semaphore.wait() // here, we claim the semaphore, making cleanup
// wait until updateUI is done
DispatchQueue.main.asyncAfter(deadline: delay) {
updateUI()
semaphore.signal()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5847 次 |
| 最近记录: |