8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 swift 脚本中等待异步调用

roee 1月前

35 0

我正在编写一个在终端中运行的 swift 脚本,该脚本将几个操作分派到后台线程。无需任何额外的努力,在我完成所有分派后,代码就到达了结尾...

我正在编写一个在终端中运行的 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)
}
帖子版权声明 1、本帖标题:在 swift 脚本中等待异步调用
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由roee在本站《swift》版块原创发布, 转载请注明出处!
最新回复 (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 核心的数量,那么你必须做更多的工作。

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

  • 除了使用 之外 dispatch_groups ,您还可以执行以下操作:

    yourAsyncTask(completion: {
        exit(0)
    })
    
    RunLoop.main.run()
    

    一些资源:

    • RunLoop 文档
    • 来自 swift-sh 项目的示例
    • 退出代码含义
  • 感谢 Aaron Brager 提供 Swift 命令行工具中的多个 worker ,

    我使用 dispatch_groups 来寻找答案,从而解决了该问题。

返回
作者最近主题: