Ios CoreData PerformBackground任务冲突

Ios CoreData PerformBackground任务冲突,ios,swift,xcode,core-data,Ios,Swift,Xcode,Core Data,我正在使用CoreData,当我试图在容器的performBackgroundTask函数中保存上下文时遇到问题 我同时从多个地方打电话。我的理解是,每次尝试保存到persistentStore时,线程都会不同,从而导致问题 我曾想过使用childContext和其他方法,直到我看到以下文章: 在本文中,coreData堆栈如下所示: final class DataCoordinator { //MARK: - singleton static let sharedInsta

我正在使用CoreData,当我试图在容器的performBackgroundTask函数中保存上下文时遇到问题

我同时从多个地方打电话。我的理解是,每次尝试保存到persistentStore时,线程都会不同,从而导致问题

我曾想过使用childContext和其他方法,直到我看到以下文章:

在本文中,coreData堆栈如下所示:

final class DataCoordinator {
    //MARK: - singleton
    static let sharedInstance = DataCoordinator()

    //MARK: - init
    public var container : NSPersistentContainer
    private init() {
        container = NSPersistentContainer(name: "Model")
        container.loadPersistentStores(completionHandler: { (_, error) in
            if let error = error {
                fatalError("Unresolved error \(error)")
            }
        })
    }

    //MARK: - perform methods
    static func performBackgroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
        DataCoordinator.sharedInstance.container.performBackgroundTask(block)
    }

    static func performViewTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
        block(DataCoordinator.sharedInstance.container.viewContext)
    }
}
我的问题是,使用这种方法,静态func performBackgroundTask是否会克服这个问题,并始终在同一队列上为我提供相同的背景上下文,或者这与我以前每次使用container.performBackgroundTask时所做的没有什么不同


想知道如何在同一队列上同时从多个位置进行保存吗?

首先,这与队列无关,
NSManagedObjectContext
在不同的队列上运行,如在主队列上运行viewContext。因此,在您的情况下,我认为您希望使用相同的
NSManagedObjectContext
从不同的位置进行保存?如果是这种情况,您可以获取一个newBackgroundContext并保存其引用,然后使用此上下文从所有位置保存任务。使用下面的
NSPersistentContainer
方法获取背景上下文

func newBackgroundContext() -> NSManagedObjectContext
如果我对你的问题的理解是错误的,请让我知道更多,这样我可以给你其他的解决方案

同样,你提到的教程中的以下方法对你不起作用

static func performBackgroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
        DataCoordinator.sharedInstance().container.performBackgroundTask(block)
    }
因为
performBackgroundTask
总是创建一个新的上下文。苹果博士说:


每次调用此方法时,持久化容器创建一个新的
NSManagedObjectContext
,concurrencyType设置为
NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType。
持久化容器然后针对上下文的专用队列上新创建的上下文执行传入块。

与问题无关,但单例语法既麻烦又过时。将
私有静态变量协调器:DataCoordinator?
替换为
静态让sharedInstance=DataCoordinator()
并删除整个
sharedInstance()
方法。谢谢。我已经更新了我的代码以删除singleton,并对代码进行了编辑以反映您的建议我理解您的意思,但我想知道将其设置为静态函数是否只需调用performBackgroundTask函数一次,并以同样的方式将其传递给变量前面的static函数。如果是这样的话,它应该只在一个上下文中工作。你是说它是一个静态函数,所以总是在同一个上下文中工作?我是问是否是这样。我以前没有使用过静态函数OK,尽管它是静态函数。每次您调用时,它都会在新上下文上执行任务。