Базовые данные deleteObject: устанавливает атрибуты в ноль - PullRequest
3 голосов
/ 03 июня 2010

Я реализую механизм отмены / повтора в моем приложении. Это отлично работает для многих случаев. Тем не менее, я не могу отменить прошлое deleteObject :. объект правильно сохраняется в очереди отмены, и я получаю его обратно и заново вставляю в стек основных данных при вызове отмены. Проблема в том, что все его атрибуты устанавливаются в ноль, когда я его удаляю.

У меня есть сущность "Canvas" с отношением ко многим, называемым "graphics", к сущности "Graphic", у которой обратное значение равно "canvas" Удаление графики, а затем ее вставка обратно не работает. Вот код (метод повтора в основном тот же):

- (void)deleteGraphic:(id)aGraphic {
 //NSLog(@"undo drawing");
 //Prepare the undo/redo
 [self.undoManager beginUndoGrouping];
 [self.undoManager setActionName:@"Delete Graphic"];

 [[self.detailItem valueForKey:@"graphics"] removeObject:aGraphic];
 [[self managedObjectContext] deleteObject:aGraphic];

 //End undo/redo
 [self.undoManager registerUndoWithTarget:self selector:@selector(insertGraphic:) object:aGraphic];
 [self.undoManager endUndoGrouping];

 NSLog(@"graphics are %@", [self sortedGraphics]);

 //Update drawing
 [self.quartzView setNeedsDisplay];
}

и вот странность:

Перед удалением:

graphics are (
<NSManagedObject: 0x1cc3f0> (entity: Graphic; id: 0x1c05f0 <x-coredata:///Graphic/t840FE8AD-F2E7-4214-822F-7994FF93D4754> ; data: {
canvas = 0x162b70 <x-coredata://A919979E-75AD-474D-9561-E0E8F3388718/Canvas/p20>;
content = <62706c69 73743030 d4010203 04050609 0a582476 65727369 6f6e5424 746f7059 24617263 68697665 7258246f 626a6563 7473>;
frameRect = nil;
label = nil;
order = 1;
path = "(...not nil..)";
traits = "(...not nil..)";
type = Path;
})

После повтора:

graphics are (
<NSManagedObject: 0x1cc3f0> (entity: Graphic; id: 0x1c05f0 <x-coredata:///Graphic/t840FE8AD-F2E7-4214-822F-7994FF93D4754> ; data: {
canvas = nil;
content = nil;
frameRect = nil;
label = nil;
order = 0;
path = nil;
traits = nil;
type = nil;
}),

Вы можете видеть, что это тот же объект, просто полностью отбеленный Core Data. Очевидно, что отношения удаления маршрутов не имеют к этому никакого отношения, поскольку в тесте я установил для них «Нет действия».

1 Ответ

2 голосов
/ 04 июня 2010

Ну, я не доволен исправлением, но один из способов - выполнить [moc save] для контекста перед удалением объекта. К сожалению, в ситуациях отмены / возврата это означает, что я должен сохранять после каждой операции, что является неоптимальным, но устраняет эту проблему.

...