等待 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()
部分资源:
我正在编写一个 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()
部分资源: