我有两个托管对象上下文,并且我通常建议将每个都用于fetch
vs update
。
但是,我使用newBackgroundContext()
保存数据的所有尝试都失败了。 performBackgroundTask
也无效。
我使用viewcontext
成功保存(下面的代码成功),但是它达到了具有后台保存功能的目的。另外,将来可能会导致性能不佳。
我已经尝试在两种情况下都设置automaticallyMergesChangesFromParent = true
,但无济于事。
下面的代码中的[CoreDataManager
是一个样板类,它设置了返回persistentContainer
和context
对象的惰性变量。
是否有适当的方法在任何地方指示如何处理此标准问题?
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)")
}
}
如果我使用newBackgroundContext()进行获取并保存两者(仅在 下面的功能,而不是在我的UI中),它也可以正常工作。但是我不知道这是否 推荐方法
是,这是正确的方法。
在某些上下文中初始化数据时,必须将其保存在相同的上下文中。如果您尝试保存另一个上下文,则该文本将不起作用,因为该另一个上下文没有更改。
[使用一个上下文获取某些数据时:
let result = try context.fetch(fetchRequest)
然后您修改它:
myModel.data = data
它是可见仅在此上下文中。这意味着,如果您尝试保存其他上下文,则不会参见对模型所做的更改,并且您的数据也不会保存。