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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSPersistentContainer,performBackgroundTask,调用perform什么都不做相关的知识,希望对你有一定的参考价值。

我刚刚开始研究一个新项目,并且认为我会尝试使用Core Data的NSPersistentContainer而不是编写自己的堆栈。

我只是偶然发现了这个问题,如果任务是作为performmanagedObjectContext的一部分开始的话,调用NSPersistentContainerperformBackgroundTask方法实际上什么也没做。

以下是我目前正在进行的演示该问题的片段。请注意,我有一个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")
        )
    

答案

它因为group.wait()召唤。 group.wait()将阻止当前线程,context.perform也将尝试在同一线程上运行。

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

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

NSPersistentContainer, performBackgroundTask, 调用 perform 啥都不做

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

如何在 AppDelegate 中包含 NSPersistentContainer

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

NSPersistentContainer newBackgroundContext 的最佳实践是啥?