NSPersistentContainer,performBackgroundTask,调用perform什么都不做
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSPersistentContainer,performBackgroundTask,调用perform什么都不做相关的知识,希望对你有一定的参考价值。
我刚刚开始研究一个新项目,并且认为我会尝试使用Core Data的NSPersistentContainer
而不是编写自己的堆栈。
我只是偶然发现了这个问题,如果任务是作为perform
的managedObjectContext
的一部分开始的话,调用NSPersistentContainer
的performBackgroundTask
方法实际上什么也没做。
以下是我目前正在进行的演示该问题的片段。请注意,我有一个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