ViewContext не получает обновления от newBackgroundContext () - PullRequest
8 голосов
/ 01 июля 2019

В переполнении стека уже есть похожий вопрос, но он не работает для меня.

В моем приложении есть сценарий использования, в котором я должен наблюдать за изменениями базы данных, чтобы выполнить какую-либо операцию. Для получения обновлений я подписался на уведомление NSManagedObjectContextObjectsDidChange (для ViewContext), а также включил automaticallyMergesChangesFromParent.

Но если я update или delete объекта в каком-то другом контексте (используя newBackgroundContext()), я не получаю уведомление об изменении объекта, но он отлично работает для inserting новых объектов.

Не могли бы вы, пожалуйста, подсказать мне, почему он работает только для вставки, а не для обновления и удаления даже после включения automaticallyMergesChangesFromParent? если это реальное поведение, есть ли другой способ решить мой вариант использования?

Документация (в NSManagedObjectContext.h) для .automaticallyMergesChangesFromParent гласит:

Будет ли контекст автоматически объединять изменения, сохраненные в его координатор или родительский контекст. Установка этого свойства в YES, когда контекст прикреплен к нетоковому генерации запроса не поддерживается.

Что я пробовал

  • Я отладил тестированием, если обновленные / удаленные объекты уже зарегистрирован в контексте просмотра. Да, они уже зарегистрированы.
  • Я тестировал то же самое, используя NSFetchResultController, это работает хорошо, но, к сожалению, я не могу использовать NSFetchResultController, как я использовать пользовательское представление для представления данных
  • Кроме того, я попытался создать новый privateQueueConcurrencyType контекст и установить viewContext в качестве родителя, и он неожиданно начал работать, поэтому проблема возникает только при использовании newBackgroundContext(), но в соответствии с документом он должен работать правильно, так как оба используют один и тот же NSPersistentStoreCoordinator

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 21 июля 2019

«Я не могу использовать NSFetchResultController, поскольку я использую пользовательское представление для представления данных», не соответствует действительности, FRC можно и нужно использовать с любым представлением (которое показывает несколько объектов).

Что касается того, почему вы не получаете NSManagedObjectContextObjectsDidChange в случае обновлений (которые приходят как обновленные) или удаления, у меня есть несколько теорий:

  1. Возможно, неправильно назван _persistentContainer.viewContext.automaticallyMergesChangesFromParent = YES;, потому что именно это вызывает ситуацию, которую вы описываете (получение вставок, но не обновлений или удалений). Это должно быть сделано в пользовательском геттере persistentContainer в делегате приложения после loadPersistentStoresWithCompletionHandler (а не внутри блока).

  2. Возможно, не используется performBlock с фоновым контекстом.

  3. Возможно, не зарегистрировано правильно для уведомления об изменении.

  4. (в свете новой информации) Не сохранять выбранные объекты.

Если вы хотите поделиться некоторым кодом, мы можем помочь вам отследить ошибку.

0 голосов
/ 15 июля 2019

Вероятно, не полностью ответ, но только некоторые мысли и предложения, которые недостаточно хорошо структурированы для комментария.

Это может быть связано с тем, что viewContext не сохраняет объекты, а скорее просто ошибки, потому что они больше не использовались напрямую (например, в виде таблицы). Для этого будет retainsRegisteredObjects .

Кроме того, вы когда-нибудь обращались к свойству, которое было изменено в viewContext? Это также может быть проблемой, поскольку он не распознает изменения в объекте, который никогда не читался.

Я настоятельно рекомендую использовать один или несколько FRC для этих случаев, они соединяют для вас уведомления и обеспечивают более чистый интерфейс. Не имеет значения, если у вас есть пользовательское представление, просто реализуйте методы FRCDelegate, и все будет в порядке. Я думаю, вам будет легче помочь, если вы зададите другой вопрос, почему вы не можете использовать FRC (где проблемы?) С вашим пользовательским представлением.

...