Правильный способ добиться такого рода вещей - с помощью нового контекста управляемого объекта.Вы создаете контекст управляемого объекта с тем же постоянным хранилищем:
NSManagedObjectContext *tempContext = [[[NSManagedObjectContext alloc] init] autorelease];
[tempContext setPersistentStore:[originalContext persistentStore]];
Затем вы добавляете новые объекты, изменяете их и т. Д.
Когда приходит время сохранения, вам нужно вызвать [tempContext save: ...] в tempContext и обработайте уведомление о сохранении, чтобы объединить его с исходным контекстом.Чтобы отбросить объекты, просто освободите этот временный контекст и забудьте об этом.
Поэтому, когда вы сохраняете временный контекст, изменения сохраняются в хранилище, и вам просто нужно вернуть эти изменения в ваш основной контекст:
/* Called when the temp context is saved */
- (void)tempContextSaved:(NSNotification *)notification {
/* Merge the changes into the original managed object context */
[originalContext mergeChangesFromContextDidSaveNotification:notification];
}
// Here's where we do the save itself
// Add the notification handler
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(tempContextSaved:)
name:NSManagedObjectContextDidSaveNotification
object:tempContext];
// Save
[tempContext save:NULL];
// Remove the handler again
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSManagedObjectContextDidSaveNotification
object:tempContext];
Это также путьВы должны обрабатывать многопоточные операции с основными данными.Один контекст на поток.
Если вам нужен доступ к существующим объектам из этого временного контекста (для добавления связей и т. Д.), Вам нужно использовать идентификатор объекта, чтобы получить новый экземпляр, подобный этому:
NSManagedObject *objectInOriginalContext = ...;
NSManagedObject *objectInTemporaryContext = [tempContext objectWithID:[objectInOriginalContext objectID]];
Если вы попытаетесь использовать NSManagedObject
в неправильном контексте, вы получите исключения при сохранении.