MagicalRecord 2.3 Временные объекты
Иногда мне нужно обновить уже сохраняемый управляемый объект другим временным управляемым объектом, созданным из ответа сервера. Временный объект должен быть удален, а другой должен быть сохранен сразу после операции обновления. В MagicalRecord (MR) 2.3++ рекомендуется сохранять объекты следующим образом:
- (void)updateObject:(NSManagedObject*)alreadyPersistedObject withDictionary:(NSDictionary*)dictionary {
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
NSManagedObject *updatedObject = [NSManagedObject MR_createEntityInContext:localContext];
[MyParserHandler parseDictionary:dictionary intoManagedObject:updatedObject];
// update some properties of alreadyPersistedObject using updatedObject
}];
}
Я знаю, что мы должны инициализировать временные объекты, используя временные локальные контексты в более ранних версиях MR. Это также верно для MR 2.3 и выше?
Если ДА, может кто-нибудь дать мне пример кода для этого и нуждается в том, чтобы временный контекст был дочерним по отношению к [NSManagedObjectContext MR_defaultContext] и как отказаться от этого контекста после использования?
Если НЕТ, каков предпочтительный метод сделать это сейчас?
Большое спасибо за помощь!
1 ответ
Просто чтобы сформулировать проблему, вы пытаетесь обновить существующие данные из внешнего источника данных в ваше основное хранилище данных. Вы создаете фоновый контекст и имеете временные объекты, в которые вы импортируете эти внешние данные, а затем сохраняете. Итак, вы хотите, чтобы эти новые изменения распространялись на ваши существующие объекты в памяти.
Если это так, то если вы просто используете тело этого метода, контекст по умолчанию, предоставленный MagicalRecord, будет иметь эти обновления после завершения этого блока. MagicalRecord пытается сделать большую часть этой объединяющей работы для вас. Если вы просто создаете свой временный объект внутри saveWithBlock:
метод, сохранение в конечном итоге объединит эти изменения с контекстом по умолчанию. Таким образом, если ваши объекты находятся в этом контексте, они получат эти изменения в результате сохранения.
Если вы обнаружите, что вам нужен больший контроль над слиянием данных, я предлагаю вам использовать встроенные механизмы слияния базовых данных, а не пытаться объединять их вручную. В этом случае вам следует использовать контекстные отношения родитель / потомок или NSManagedObjectContextDidSaveNotification
объединить изменения из другого контекста. Код для этих решений довольно распространен в Интернете.