Swift - 如何等待dispatch_async完成?

时间:2015-11-20 11:27:23

标签: multithreading swift core-data

当我的应用程序第一次启动时,我执行将数据从磁盘导入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()

       }

   }
}

2 个答案:

答案 0 :(得分:0)

也许你应该尝试为importArticlesListFromDisk和importArticlesFromDisk添加一个完成处理程序,然后从完成块中的db加载。

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()
       }
    }
}

答案 1 :(得分:0)

我建议使用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)

这样,从数据库导入只会在从磁盘导入完成后运行。我个人使用这个很多。

祝你好运 [R