当前位置: 首页 > 面试题库 >

等待直到任务完成

齐英朗
2023-03-14
问题内容

如何让我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西?

func myFunction() {
    var a: Int?

    DispatchQueue.main.async {
        var b: Int = 3
        a = b
    }

    // wait until the task finishes, then print

    print(a) // - this will contain nil, of course, because it
             // will execute before the code above

}

我正在使用Xcode 8.2并在Swift 3中编写。


问题答案:

使用DispatchGroups可以实现这一点。您可以在群组enter()leave()通话达到平衡时得到通知:

func myFunction() {
    var a: Int?

    let group = DispatchGroup()
    group.enter()

    DispatchQueue.main.async {
        a = 1
        group.leave()
    }

    // does not wait. But the code in notify() gets run 
    // after enter() and leave() calls are balanced

    group.notify(queue: .main) {
        print(a)
    }
}

或者您可以等待:

func myFunction() {
    var a: Int?

    let group = DispatchGroup()
    group.enter()

    // avoid deadlocks by not using .main queue here
    DispatchQueue.global(attributes: .qosDefault).async {
        a = 1
        group.leave()
    }

    // wait ...
    group.wait()

    print(a) // you could also `return a` here
}

注意
group.wait()阻止当前队列(在您的情况下可能是主队列),因此您必须dispatch.async在另一个队列上(如上面的示例代码中)以避免
死锁



 类似资料:
  • 我想哭我的日程安排,直到我的任务完成。如果有时间执行第二个计划,则必须等到上一个任务尚未完成。我在java启动应用程序中使用@Schedule。我想每5分钟向数据库中插入一次数据,但我想保留我的时间表,直到插入的数据还没有完成,还有时间进行第二次执行。演示代码

  • 问题内容: 我在Ubuntu上用python编写程序。在该程序中,我试图在连接到网络的远程计算机(RaspberryPi)上完成任务“删除文件”后打印一条消息。 但是在实际中,打印命令不会等到远程计算机上的任务完成。 有人可以指导我该怎么做吗?我的编码如下 问题答案: 这确实是在完成之前返回的paramiko SSH exec_command(shell脚本)返回的副本,但是那里的答案并不十分详细

  • 问题内容: 等待所有任务完成的最简单方法是什么?我的任务主要是计算,所以我只想运行大量的作业-每个内核上一个。现在,我的设置如下所示: 实现可运行。这似乎是正确执行的任务,但代码崩溃上用。这很奇怪,因为我玩了一些玩具示例,而且看起来很奏效。 包含数以万计的元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西 问题答案: 最简单的方法是使用单行代码执行所需的操作。用你的话来说,你需要修改或包装以实

  • 我正在运行的服务器应用程序获取我要使用任务系统处理的多个任务请求。 每个任务都表示为一个可运行的线程池,该线程池中的线程数小于或等于线程池的大小,需要线程池中的线程数。当然,线程池是必要的,以避免CPU因线程过多而过载。 然而,其中一些任务可以是多线程的,而另一些则不能。这就是为什么一个任务可能需要等待其所有特定线程完成,以便合并这些线程的结果以获得最终结果的原因。 如果使用多个实例,则可以像这样

  • 在C#中,我有以下两个简单的例子: 第一个示例创建一个打印“开始”的任务,等待5秒钟打印“完成”,然后结束任务。我等待任务完成,然后打印“全部完成”。当我运行测试时,它会按预期运行。 第二个测试应该具有相同的行为,只是由于使用了async和Wait,任务内部的等待应该是非阻塞的。但是这个测试只打印“开始”,然后立即打印“全部完成”和“完成”,永远不会打印。 我不知道我为什么会有这样的行为:S非常感

  • 我在网上搜索了很多关于vs await async,但是在这个特定的使用场景中,我并不真正理解其中的区别。我相信情况很简单。 vs. 其中,是一个异步方法,其中包含一些异步调用,例如使用wait调用db。 问题: 在这种情况下,两者之间有什么区别吗?任何帮助或意见,谢谢!