두 개의 관리되는 개체 컨텍스트가 있으며 일반적으로 권장 fetch
되는대로 각각을 사용하고 싶습니다 update
.
그러나 newBackgroundContext()
내 데이터를 저장 하려는 모든 시도 는 실패했습니다. performBackgroundTask
또한 작동하지 않았습니다.
사용하여 저장하는 viewcontext
데 성공했지만 (아래 코드는 성공했습니다) 백그라운드 저장 기능을 갖는 목적을 무효화합니다. 또한 향후 성능이 저하 될 수 있습니다.
나는 이미 automaticallyMergesChangesFromParent = true
두 가지 맥락에서 설정 을 시도 했지만 아무 소용이 없습니다.
CoreDataManager
내 아래 코드에서 게으른 vars 반환 persistentContainer
및 context
개체를 설정하는 상용구 클래스 입니다.
이 표준 문제를 처리하는 방법을 어디에나 표시하는 적절한 방법이 있습니까?
추신 :을 사용하여 대량의 개체를 삽입하려고하면 정상적으로 newBackgroundContext()
작동합니다. 업데이트가 유일한 문제입니다. 아마도 viewContext
.
PS + : 그 문제에 대해 내가 newBackgroundContext()
가져 오기에 사용 하고 둘 다 저장하면 (내 UI가 아닌 아래 기능에서만) 작동합니다. 그러나 이것이 권장되는 접근 방식인지 모르겠습니다.
PS ++ : 나는 또한 newBackgroundContext()
매번 새로운 것을 생성하지 않기 위해 lazy var로 래핑을 시도했는데 , 어쨌든 내부에서 발생 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
그것은 볼 만이 맥락에서. 어떤 수단 당신이 그것을하지 않습니다 다른 컨텍스트를 저장하려고하면 참조 모델의 변경 및 데이터가 저장되지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다