Дочерний контекст CoreData не передает изменения в родительский после повторного сохранения - PullRequest
0 голосов
/ 08 ноября 2019

Я должен сохранить рецепт, если пользователь нажмет кнопку «Нравится», если неприязнь удалит.

У меня есть два контекста:

Контекст 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)  }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...