Разработка iPhone/iPod touch приложений: CoreData и Undo Manager, или как безопасно изменять контекст.
Многие, наверное, уже пробовали работать с CoreData и хотя бы краем уха слышали/краем глаза видели что-то о поддержке undo/redo для контекста объектов. Дело в том, что существуют механизмы, позволяющие при изменении объектов, унаследованных от NSManagedObject и находящихся в контексте NSManagedObjectContex, производить перемещение по т.н. контекстному графу при помощи методов undo и redo. Вершины этого графа создаются путем вызова у контекста метода processPendingChanges, после чего последующие изменения объектов в контексте можно откатить до их состояния на момент создания вершины методом undo. Также можно перемещаться между созданными вершинами, вызывая методы undo (к предыдущей вершине) или redo (к следующей вершине). За обработку и управление изменениями отвечает undoManager – объект класса NSUndoManager, который есть у объекта- контекста. Сдесь небольшое уточнение – есть, если только вы программируете под Mac OS. В iPhone SDK undoManager не инициализируется при инициализации контекста!
[context undoManager] == nil;// == YES !!!!!!!!
Его нужно инициализировать вручную.
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [context setUndoManager: [[[NSUndoManager alloc] init] autorelease]]; [pool release];
Также необходимо отметить, что накопленные вершины графа объектов undoManager’a контекста (по простому – история изменений) не удаляются при сохранении контекста. Историю undoManager’a также нужно очищать вручную при сохранении, чтобы версии объектов контекста не были старше, чем версии объектов в хранилище, поскольку при следующей попытке сохранения контекста может возникнуть конфликт. Это можно сделать таким образом:
NSError *error;
if([context save:&error]) {
NSUndoManager *um = [context undoManager];
[um removeAllActions];
} else {
NSLog(@"ERROR OCCURRED: %@", [error userInfo]);
}
Также можно делать undoManager = nil в случаях, если необходима высокая производительность. Например при импорте большого количества данных.
Теперь, когда расставлены все точки над ё, и мы убедились, что путешествия между изменениями контекста всЁтаки возможны :), можно смело приступать к проектированию сложной логики по внесениям и откатам оных…






Пока нет комментариев.