Swift - 我如何等待 dispatch_async 完成?

Posted

技术标签:

【中文标题】Swift - 我如何等待 dispatch_async 完成?【英文标题】:Swift - how can I wait for dispatch_async finish? 【发布时间】:2015-11-20 11:27:22 【问题描述】:

当我的应用程序第一次启动时,我执行将数据从磁盘导入 CoreData 的任务。我在后台线程中做薄。然后我切换到主线程并从 CoreData 执行加载。

问题是有时会在从磁盘导入完成之前从 CoreData 加载。所以我需要一种方法来等待导入完成,并且只有他们从 db 执行加载。

如何在 Swift 中做到这一点?

我的代码如下所示:

func firstTimeLaunch() 

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0))  [unowned self] in

self.importArticlesListFromDisk()
self.importArticlesFromDisk()

       dispatch_async(dispatch_get_main_queue())  [unowned self] in

       self.loadArticlesListFromDb()
       self.loadArticlesFromDb()

       

   

【问题讨论】:

您是否尝试在“importArticlesFromDisk”的末尾加载数据? importArticlesListFromDiskimportArticlesFromDisk 额外拨打dispatch_async 吗?因为如果没有,您的代码看起来会很好。 如果 Tom 引用的这两种方法中的任何一种是异步的,我们可以向您展示如何添加像subjective_c 推荐的完成处理程序。但我们可能需要看看这两种方法是什么样子才能更具体。 【参考方案1】:

也许您应该尝试向 importArticlesListFromDisk 和 importArticlesFromDisk 添加一个完成处理程序,然后在完成块中从数据库加载。

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0))  [unowned self] in
    self.importArticlesAndArticlesListFromDisk() 
       // Completion Handler
       dispatch_async(dispatch_get_main_queue())  [unowned self] in
           self.loadArticlesListFromDb()
           self.loadArticlesFromDb()
       
    

【讨论】:

【参考方案2】:

我建议使用 NSOperations。 wwdc15 对此进行了精彩的讨论

示例代码也很有趣。

基本上,您希望为每个导入创建一个并发操作:

假设我们覆盖了从磁盘导入文章列表的操作的启动函数:

override func start 
    //long running import operation, even async...
    //when done: self.finish() //needs kvo overrides
    //finish causes the concurrent operation to terminate

你可以对操作做一件非常好的事情,就是设置依赖关系:

let importArticlesFromDiskOp = ...
let importArticlesFromDBOp = ...

importArticlesFromDBOp.addDependency(importArticlesFromDiskOp)

这样,您从数据库的导入只会在从磁盘导入完成后运行。我个人经常使用它。

祝你好运 回复

【讨论】:

以上是关于Swift - 我如何等待 dispatch_async 完成?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 我如何等待 dispatch_async 完成?

如何在swift中等待ui委托

如何让任务在 Swift 3 中等待完成

如何在从 Swift 3 中的函数返回结果之前等待 URLSession 完成

Swift:如何对服务进行 API 调用但不等待响应

在执行代码之前等待 Swift 动画完成