您如何等待主队列完成处理程序?
Posted
技术标签:
【中文标题】您如何等待主队列完成处理程序?【英文标题】:How do you wait on a main queue completion handler? 【发布时间】:2017-11-26 22:33:07 【问题描述】:我正在尝试做的是顺序执行一个 for 循环,在开始下一次迭代之前我等待 completionHandler()。
在迭代之前我必须等待完成处理程序返回 保证返回到完成处理程序 我正在尝试在较低优先级队列中同步等待代码:
// we're on the main queue
for index in 0..<count
var outcome: Any?
let semaphore = DispatchSemaphore(value: 0)
let queue = DispatchQueue(label: "\(index) iteration")
// this will access a UI component and wait for user to
// enter a value that's passed to the completion handler
funcWithCompletionHandler() [weak self] (result) in
outcome = result
semaphore.signal()
// wait here for the completion handler to signal us
queue.sync
semaphore.wait()
if let o = outcome
handleOutcome(outcome)
// now, we iterate
我已经尝试了很多我在这里看到的其他解决方案,但似乎没有任何效果。
【问题讨论】:
永远不要等到主线程。将等待同步分派到另一个队列也没有更好的办法。消除信号量并在原异步调用的完成块中调用完成处理程序。或者,如果您认为出于某种原因不能这样做,请说明原因,我们可以提供替代方案。 我不确定您所说的“调用完成处理程序...”是什么意思,更多信息,funcWithCompletionHandler() 闭包正在转义。它打开一个模态子视图控制器,该控制器在解雇时使用用户输入的结果值调用完成处理程序。 【参考方案1】:我更喜欢与背景组一起工作,您可以像这样在您的班级中创建一个实例:
var group = DispatchGroup()
DispatchQueue.global(qos: .background).async
self.group.wait()
// this part will execute after the last one left
// .. now, we iterate part
for index in 0..<count
var outcome: Any?
let queue = DispatchQueue(label: "\(index) iteration")
funcWithCompletionHandler() [weak self] (result) in
if let strongSelf = self
outcome = result
strongSelf.group.enter() // group count = 1
queue.sync
if let o = outcome
handleOutcome(outcome)
self.group.leave()
// right here group count will be 0 and the line after wait will execute
【讨论】:
谢谢,这是我想要做的,但另一个 UI 问题让我不清楚这是否有效。以上是关于您如何等待主队列完成处理程序?的主要内容,如果未能解决你的问题,请参考以下文章