Недавно я запустил новое приложение, требующее только одного магазина (без приложения на основе документов). Некоторое время я был вполне счастлив, думая, что наконец-то смогу избавиться от разбрасывания NSManagedObjectContext... пока не захотел сохранить в фоновом режиме :-(
Теперь я запутался в своем собственном коде. Например:
- (void)awakeFromInsert
{
[super awakeFromInsert];
[self resetCard];
self.creationDate = TODAY;
self.dictionary = [Dictionary activeDictionary];
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotificationName:NOTE_NEWCARD object:self];
}
[Dictionary activeDictionary] — это статическая функция NSManagedObject, возвращающая указатель на NSManagedObject, созданный в основном потоке. Это вызовет перекрестную/контекстную ошибку во время фонового сохранения. Поскольку моя программа всегда читала из одного и того же хранилища, я подумал, что смогу избежать написания этого:
[Dictionary activeDictionaryWithContext:...]
Я полагаю, что с MagicalRecord, пока я всегда работаю с одним и тем же бэкэндом, можно избежать передачи указателя контекста. Какую функцию следует использовать для получения этого контекста?
[NSManagedObjectContext MR_defaultContext]
[NSManagedObjectContext MR_context]
[NSManagedObjectContext MR_contextForCurrentThread]
В примере объект отправляет себя в уведомлении, что почти само собой разумеющееся, чтобы вызвать больше конфликтов.
- В случае уведомления я должен всегда отправлять только objectID?
Мне кажется, что мои объекты должны выдавать операции/уведомления с побочными эффектами только в том случае, если они выполняются в основном контексте. Однако некоторые из этих побочных операций изменяют мой граф объектов, создавая новые экземпляры других объектов.
Могу ли я безопасно пропустить два проблемных вызова функций, о которых я упоминал, если я сохраняю с помощью [MagicalRecord MR_saveAll]?
Должен ли я предположить, что объекты нового контекста фонового сохранения будут точной копией объектов в моем основном потоке без вызова этих дополнительных функций?
Теперь у меня проблемы, потому что я никогда не ожидал, что awakeFromInsert будет запускаться несколько раз для одного и того же объекта в одном и том же хранилище. Я думал о чем-то вроде этого:
- (void)awakeFromInsert
{
[super awakeFromInsert];
if ([self managedObjectContext] == [NSManagedObjectContext MR_defaultContext]) {
[self resetCard];
self.creationDate = TODAY;
self.dictionary = [Dictionary activeDictionary];
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotificationName:NOTE_NEWCARD object:self];
}
}
Это должно заставить мой код awakeFromInsert запускаться только один раз, но не в контексте фонового сохранения. Я боюсь потерять информацию, если я это сделаю