CoreData performBackgroundTask冲突

时间:2018-07-22 09:06:35

标签: ios swift xcode core-data

我正在使用CoreData,并且在尝试在容器的performBackgroundTask函数中保存context时遇到问题。

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

我想到使用childContext的方法和其他方法,直到遇到以下文章:

https://blog.five.agency/how-to-import-a-large-data-set-using-core-data-6c248a503148

在本文中,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)
    }
}

我的问题是使用这种方法,静态函数performBackgroundTask是否会解决此问题,并始终在同一队列中为我提供相同的背景上下文,或者这与我以前每次对container.performBackgroundTask所做的操作没有什么不同?

想知道如何在同一队列中同时从多个位置保存?

1 个答案:

答案 0 :(得分:0)

首先,它与队列无关,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.。然后,持久性容器将针对上下文创建的上下文在私有队列中执行传入的块