等待 swift 脚本中的异步调用

Waiting for asynchronous calls in a swift script

我正在编写一个 swift 脚本,以便在终端中 运行 向后台线程分派几个操作。没有任何额外的努力,在我完成所有调度后,代码到达文件末尾并退出,同时终止了我的后台操作。在我的后台操作完成之前保持 swift 脚本活动的最佳方法是什么?

我想到的最好的方法如下,但我不认为这是最好的方法,甚至不是正确的方法。

var semaphores = [dispatch_semaphore_t]()
while x {
  var semaphore = dispatch_semaphore_create(0)
  semaphores.append(semaphore)
  dispatch_background {
    //do lengthy operation
    dispatch_semaphore_signal(semaphore)
  }
}

for semaphore in semaphores {
  dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
}

这样的事情怎么样:

func runThingsInTheBackground() {
    var semaphores = [dispatch_semaphore_t]()

    for delay in [2, 3, 10, 7] {
        var semaphore = dispatch_semaphore_create(0)
        semaphores.append(semaphore)

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
            sleep(UInt32(delay))
            println("Task took \(delay) seconds")

            dispatch_semaphore_signal(semaphore)
        }
    }

    for semaphore in semaphores {
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
    }
}

这与您所拥有的非常相似。我的工作 'queue' 是一系列休眠秒数,以便您可以看到背景中发生的事情。

请注意,这只会在后台运行所有任务。如果你想将活动任务的数量限制为 CPU 核心的数量,那么你必须做更多的工作。

不确定这是否是您要找的,请告诉我。

感谢 Aaron Brager,他链接到 ,

这是我用来寻找答案的方法,使用dispatch_groups来解决问题。

除了使用dispatch_groups,您还可以进行以下操作:

yourAsyncTask(completion: {
    exit(0)
})

RunLoop.main.run()

部分资源: