Странная проблема с CoreData и еще более странное решение. Есть идеи, почему?

Я довольно удобный пользователь CoreData. У меня была проблема, которая абсолютно убивала меня, я понял, что пошло не так, и НЕ ПОНИМАЮ, почему это вызывало проблемы, которые я видел. Кто-нибудь может это объяснить?

Хорошо, у нас есть основной MOC, который выполняет большую часть работы с данными «только для чтения» и обрабатывает простые операции записи. Когда мы собираемся выполнить большую запись/импорт/и т. д., мы выделяем фоновый MOC в новом потоке, выполняем всю тяжелую работу, а затем сохраняем его. Сохранение приводит к срабатыванию нашего NSManagedObjectContextWillSaveNotification, а затем мы mergeChangesFromContextDidSaveNotification: и все в основном MOC отражает изменения. Довольно стандартный.

Итак, несколько дней назад в один из подклассов NSManagedObject было внесено изменение. Изменением стал вызов setValue:forKey:. Когда в этом методе не выполнялась специальная обработка, мы изначально вызывали [super setValue: forKey:]. Он был изменен на [self setPrimitateValue: forKey:] и...

После сохранения будет вызван метод mergeChangesFromContextDidSaveNotification:, но основной MOC не будет отражать изменения. Так что это немного странно. Но закройте приложение, а затем снова откройте его, изменения волшебным образом БУДЕТ ЗДЕСЬ. Что!?!

Я знаю, что это какая-то проблема с постоянным хранилищем, сохраняющим изменения, но не с другим MOC. Затем, когда новый MOC создается новый запуск, все снова в стоке. Почему?

Любой свет по этой теме поможет связке.


person beinstein    schedule 03.09.2010    source источник


Ответы (1)


setPrimitiveValue:forKey: не приводит к срабатыванию всех уведомлений kvo. Я думаю, что это причина вашей проблемы. Вероятно, вам нужно обернуть его вокруг вызовов willChangeValueForKey: и didChangeValueForKey:.

person Elfred    schedule 03.09.2010
comment
Но какое значение имеют уведомления KVO? Я ничего особенного не наблюдаю, и NSManagedObjectContextWillSaveNotification срабатывал независимо. - person beinstein; 04.09.2010