Core data NSPersistentContainer,performBackgroundTask,调用perform不执行任何操作

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

我刚开始做一个新项目,我想试试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")
        })
    }
}

这是因为
group.wait()
call
group.wait()
将阻止当前线程和上下文。perform还将尝试在同一线程上运行。

这是因为
group.wait()
调用
group.wait()
将阻止当前线程和上下文。perform还将尝试在同一线程上运行