我正在编写一个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)
}
答案 0 :(得分:2)
感谢与之相关的Aaron Brager Multiple workers in Swift Command Line Tool,
这是我以前找到答案的方法,使用dispatch_groups来解决问题。
答案 1 :(得分:2)
除了使用dispatch_groups
,您还可以执行以下操作:
yourAsyncTask(completion: {
exit(0)
})
RunLoop.main.run()
一些资源:
答案 2 :(得分:0)
这样的事情怎么样:
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)
}
}
这与你所拥有的非常相似。我的工作排队'是一个几秒钟的睡眠数组,这样你就可以看到背景中正在发生的事情。
请注意,这只是在后台运行所有任务。如果要将活动任务的数量限制为例如CPU核心数,那么您必须做更多的工作。
不确定这是否是您要找的,请告诉我。