Я должен сохранить рецепт, если пользователь нажмет кнопку «Нравится», если неприязнь удалит.
У меня есть два контекста:
Контекст A (родительский) - persistentContainer.viewContext
Контекст B (ребенок) -
let childManagedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
childManagedObjectContext.parent = persistentContainer.viewContext
На RecipeVC у меня есть childManagedObjectContext с рецептом. Я использую его как песочницу. Пользователь может любить / не любить много раз.
Первый раз: когда пользователю нравится рецепт. Я спасаю B, чем контексты. Когда пользователю не нравится, я выбираю рецепт по идентификатору из A и вызываю delete.
Но если пользователю снова нравится рецепт и сохранение B, изменения не появляются в контексте A. В этот момент свойство hasChanges
имеет ложное состояние.
Цепочка: сохранить B -> сохранить A -> удалить A -> сохранить B -> (?) Рецепт должен появиться в A ...
Почему рецепт не появляется в A после сохранения?
func changeFavoriteStatus() {
isFavorite = !isFavorite
let parantContext = managedObjectContext!.parent!
if !isFavorite {
deleteRecipeInTheParentContext()
} else {
if managedObjectContext!.hasChanges {
managedObjectContext?.performAndWait{
do {
try managedObjectContext?.save()
} catch { print(error) }
if parantContext.hasChanges {
parantContext.performAndWait{
do {
try parantContext.save()
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
let predicate = NSPredicate(format: "id == %i",id)
fetchRequest.predicate = predicate
do {
let recipes = try parantContext.fetch(fetchRequest) as! [Recipe]
print("\(recipes.count) found")
} catch { print(error) }
} catch {
print(error) } } } } } }
}
private func deleteRecipeInTheParentContext() {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
let predicate = NSPredicate(format: "id == %i",id)
fetchRequest.predicate = predicate
let parantContext = managedObjectContext!.parent!
do {
let recipes = try parantContext.fetch(fetchRequest) as! [Recipe]
parantContext.performAndWait {
for reipe in recipes { parantContext.delete(reipe) }
do {
try parantContext.save()
} catch { print(error) }
}
} catch { print(error) }
}