核心数据:在后台NSManagedObjectContext上进行的更新在保存时不起作用

问题描述 投票:0回答:1

我有两个托管对象上下文,并且我通常建议将每个都用于fetch vs update

但是,我使用newBackgroundContext()保存数据的所有尝试都失败了。 performBackgroundTask也无效。

我使用viewcontext成功保存(下面的代码成功),但是它达到了具有后台保存功能的目的。另外,将来可能会导致性能不佳。

我已经尝试在两种情况下都设置automaticallyMergesChangesFromParent = true,但无济于事。

下面的代码中的[CoreDataManager是一个样板类,它设置了返回persistentContainercontext对象的惰性变量。

是否有适当的方法在任何地方指示如何处理此标准问题?

PS:当我尝试使用newBackgroundContext()插入大量对象时,它工作正常。更新是唯一的问题-可能是因为它涉及viewContext处理的提取。

PS +:为此,如果我使用newBackgroundContext()进行读取并保存两者(仅在下面的函数中,而不是在我的UI中),它也可以工作。但是我不知道这是否是推荐的方法。

PS ++:我还尝试将newBackgroundContext()包装在一个懒惰的变量下,以免每次都创建一个新变量,无论如何都在performBackgroundTask内部发生-但这种方法仍然无法成功保存。

class func updateRecord(recordId: String, data: Data)
{
    let fetchRequest = NSFetchRequest<MyModel>(entityName: "MyModel")
    let context = CoreDataManager.sharedInstance.queryContext  //wrapper for persistentContainer.viewContext which is used to fetch the intended object to update

    do
    {
        fetchRequest.predicate = NSPredicate(format: "recordId == %@", recordId)
        let result = try context.fetch(fetchRequest)
        guard let myModel = result.first
        else
        {
            throw CoreDataCustomError.ObjectNotFound
        }

        myModel.data = data

        try context.save() //works FINE!

        //what DOES NOT work:  try persistentContainer.newBackgroundContext().save() 

        //what DOES NOT work:  
        //persistentContainer.performBackgroundTask { (context) in
        //    context.save()
        //}
    }
    catch let customErr as CoreDataCustomError
    {
        print("Object does not exist in DB: \(customErr)")
    }
    catch let err
    {
        print("Error saving data \(recordId): \(err)")
    }
}
ios core-data save nsmanagedobjectcontext nsmanagedobjectmodel
1个回答
0
投票

如果我使用newBackgroundContext()进行获取并保存两者(仅在 下面的功能,而不是在我的UI中),它也可以正常工作。但是我不知道这是否 推荐方法

是,这是正确的方法。

在某些上下文中初始化数据时,必须将其保存在相同的上下文中。如果您尝试保存另一个上下文,则该文本将不起作用,因为该另一个上下文没有更改。

[使用一个上下文获取某些数据时:

let result = try context.fetch(fetchRequest)

然后您修改它:

myModel.data = data

它是可见仅在此上下文中。这意味着,如果您尝试保存其他上下文,则不会参见对模型所做的更改,并且您的数据也不会保存。

© www.soinside.com 2019 - 2024. All rights reserved.