Core data NSPersistentContainer,performBackgroundTask,调用perform不执行任何操作
我刚开始做一个新项目,我想试试Core Data的Core data NSPersistentContainer,performBackgroundTask,调用perform不执行任何操作,core-data,grand-central-dispatch,nspersistentcontainer,Core Data,Grand Central Dispatch,Nspersistentcontainer,我刚开始做一个新项目,我想试试Core Data的NSPersistentContainer,而不是编写自己的堆栈 我刚刚偶然发现了这个问题,如果任务是作为NSPersistentContainer的performBackgroundTask的一部分启动的,那么调用managedObjectContext的perform方法实际上什么也做不了 下面是我目前正在做的一个片段来演示这个问题。请注意,我有一个DispatchGroup,以确保任务按顺序执行 // DataImporter.swift
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")
})
}
}
这是因为
group.wait()
callgroup.wait()
将阻止当前线程和上下文。perform还将尝试在同一线程上运行。这是因为group.wait()
调用group.wait()
将阻止当前线程和上下文。perform还将尝试在同一线程上运行