NSPersistentContainer, performBackgroundTask, 调用 perform 啥都不做
Posted
技术标签:
【中文标题】NSPersistentContainer, performBackgroundTask, 调用 perform 啥都不做【英文标题】:NSPersistentContainer, performBackgroundTask, calling perform does nothingNSPersistentContainer, performBackgroundTask, 调用 perform 什么都不做 【发布时间】:2019-02-17 06:12:40 【问题描述】:我刚开始从事一个新项目,我想试试 Core Data 的 NSPersistentContainer
,而不是编写自己的堆栈。
我刚刚偶然发现了这个问题,如果该任务是作为NSPersistentContainer
的performBackgroundTask
的一部分启动的,那么调用managedObjectContext
的perform
方法实际上没有任何作用。
这是我目前为演示该问题所做的工作的简要说明。请注意,我有一个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