您如何等待主队列完成处理程序?

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 问题让我不清楚这是否有效。

以上是关于您如何等待主队列完成处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改默认请求完成队列?

Java主线程如何等待子线程执行结束(转)

GCD - 如何在主线程上等待在主队列上执行的异步回调

您如何在 C 多处理中等待恰好两个信号?

Swift 4:创建一个异步串行队列,每个作业后等待2秒钟

如何使“主线程”等待“子线程”执行结束后再继续执行