在swift脚本中等待异步调用

时间:2015-02-27 20:28:45

标签: swift asynchronous command-line

我正在编写一个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)
}

3 个答案:

答案 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核心数,那么您必须做更多的工作。

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