NSPersistentContainer, performBackgroundTask, 调用 perform 啥都不做

Posted

技术标签:

【中文标题】NSPersistentContainer, performBackgroundTask, 调用 perform 啥都不做【英文标题】:NSPersistentContainer, performBackgroundTask, calling perform does nothingNSPersistentContainer, performBackgroundTask, 调用 perform 什么都不做 【发布时间】:2019-02-17 06:12:40 【问题描述】:

我刚开始从事一个新项目,我想试试 Core Data 的 NSPersistentContainer,而不是编写自己的堆栈。

我刚刚偶然发现了这个问题,如果该任务是作为NSPersistentContainerperformBackgroundTask 的一部分启动的,那么调用managedObjectContextperform 方法实际上没有任何作用。

这是我目前为演示该问题所做的工作的简要说明。请注意,我有一个DispatchGroup 以确保任务按顺序执行。

// DataImporter.swift
class func importData(url: URL, context: NSManagedObjectContext, completion: () -> ()) 
    context.perform 
        // Code inside here never gets call

        DispatchQueue.main.async(execute: 
            completion()
        )
       



// ViewController.swift
func multipleImportTasks() 
    persistentContainer.performBackgroundTask  managedObjectContext in
        let group = DispatchGroup()

        group.enter()
        let fileUrl1 = Data(someData)
        DataImporter.importData(fileUrl1, context: managedObjectContext, completion: 
            group.leave()
        )

        group.wait()
        group.enter()
        let fileUrl2 = Data(someData)
        DataImporter.importData(fileUrl2, context: managedObjectContext, completion: 
            group.leave()
        )

        group.notify(queue: DispatchQueue.main, execute: 
            print("all done")
        )
    

【问题讨论】:

【参考方案1】:

这是因为group.wait() 来电。 group.wait() 会阻塞当前线程并且 context.perform 也会尝试在同一个线程上运行。

【讨论】:

以上是关于NSPersistentContainer, performBackgroundTask, 调用 perform 啥都不做的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 NSPersistentContainer.loadPersistentStores 中的错误?

NSPersistentContainer, performBackgroundTask, 调用 perform 啥都不做

NSPersistentContainer的loadPersistentStores的completionHandler是不是同步运行?

如何在 AppDelegate 中包含 NSPersistentContainer

NSPersistentContainer,performBackgroundTask,调用perform什么都不做

NSPersistentContainer newBackgroundContext 的最佳实践是啥?