Поистине странное поведение с Core Data на iOS.
У меня есть NSManagedObjectContext
для моего основного потока, который используется для чтения данных из постоянного хранилища SQLLite и отображения их пользователю. У меня также есть фоновые процессы, которыми управляет NSOperationQueue
. Эти фоновые процессы создают NSMangedObjectContext
, получают данные с удаленных серверов и сохраняют эти данные в локальном хранилище Core Data.
Я зарегистрировался на NSManagedObjectContextDidSaveNotification
, и когда я получаю эти уведомления, я вызываю mergeChangesFromContextDidSaveNotification
в NSManagedObjectContext
основного потока (передавая объект уведомления в качестве аргумента).
Все это очень стандартно, и весь документ Core Data предлагает вам иметь дело с многопоточностью.
До недавнего времени я всегда вставлял новые объекты в хранилище данных и не изменял объекты в хранилище данных. Это сработало. После того, как фоновый поток записывает новые данные, происходит слияние, я отправляю уведомление в UIController и перерисовываю свой дисплей. Дисплей рисует правильно.
Недавно я внес изменение, и фоновый поток одновременно вставляет и изменяет объекты. Но в остальном картина остается прежней. Теперь после слияния данные в NSManagedObjectContext
моего основного потока повреждены. Если я попытаюсь запросить объекты, я ничего не получу. Если я попытаюсь исследовать объекты, на которые у меня уже есть ссылка, все их отношения равны нулю (не ошибкам, а нулю). Я проверил базу данных SQLLite, и там все данные.
Единственное решение - сбросить NSManagedObjectContext
, что неприемлемо с учетом архитектуры приложения.
Хорошо, немного странностей. Если мой фоновый поток обновляет только атрибуты (примитивы), я не получаю такого странного поведения. Однако, если я обновляю сами отношения, я получаю эти пустые результаты запроса выборки и нулевые отношения.
Что мне не хватает?