Два отдельных вопроса здесь. Во-первых, если вы получаете мутирующие ошибки, это означает, что вы мутируете набор или массив (или отношение) во время перебора этого набора / массива / отношения. Найди, где ты это делаешь и прекрати это делать. Это единственное решение.
Что касается ваших обновлений. Ваш фон NSManagedObjectContext
должен периодически сохраняться. Ваш основной поток должен прослушивать NSManagedObjectContextDidSaveNotification
, а когда он получает один, он вызывает основной NSManagedObjectContext
в основном потоке (так как уведомление, скорее всего, придет в фоновом потоке) через -mergeChangesFromContextDidSaveNotification:
который принимает NSNotification
в качестве параметра. Это заставит все ваши NSFetchedResultController
экземпляры запускать их методы делегата.
Все просто.
Обновление
Спасибо за ваш ответ. Исключение выдается при обновлении NSManagedObjectContext в фоновом потоке. Я использую один и тот же NSManagedObjectContext в обоих потоках. Приложение должно быть как можно ближе к приложению реального времени - обновления постоянно и таблицы должны обновляться немедленно. Я вообще не сохраняю - я только обновляю NSManagedObjectContext. В одном из упомянутых вопросов я видел, что кто-то использовал для разделения экземпляров NSManagedObjectContext, но он все еще получает те же исключения после объединения изменений. Итак, вы предлагаете использовать 2 отдельных NSManagedObjectContext's?
Сначала прочитайте о многопоточности в Core Data из документации Apple (или моей книги :).
Во-вторых, да, у вас должен быть один контекст для потока, это одно из золотых правил Core Data и многопоточности (другое - не передавать NSManagedObject
экземпляры между потоками). Вероятно, это и есть причина вашего сбоя, а если это не так, то это будет источником сбоя в будущем.
Обновление
У меня есть тонны данных, и я обновляю только измененные / новые / удаленные элементы в таблице. Если я начну экономить, то повредит ли это производительности?
Нет, только обновления будут распространяться по всем потокам. Хранилище данных не будет перечитано, поэтому оно будет на улучшать производительность , когда вы разбиваете сохранения на более мелкие куски, потому что вы будете в основном потоке, обновляя пользовательский интерфейс, на меньших кусках, так что пользовательский интерфейс будет казаться лучше.
Однако беспокойство по поводу производительности до завершения приложения - это предварительная оптимизация, которую следует избегать. Гадать, что будет хорошо, а что нет, как правило, плохая идея.