У меня есть довольно сложная модель данных в приложении для iPad (приложение для рисования OpenGL), и я работаю над реализацией функций отмены / возврата. Мне нравится тот факт, что Core Data бесплатно отменяет изменения модели данных, но я не знаю, будет ли мне достаточно встроенных функций.
Я видел множество примеров отмены / повтора, реализованных в приложениях для рисования, однако они обычно делают следующее:
- Скажите контекст управляемого объекта
undo
.
- Перерисовать все на странице измененной модели данных.
Это ужасно неэффективно - в моем приложении мне нужно иметь возможность выполнить действие для отмены, основываясь на конкретном объекте, который «отменяется», и часто это означает обновление только части холста.
Так что мой вопрос таков: могу ли я зарегистрировать свои собственные операции отмены и использовать их вместе со встроенными отменами? Например, скажем, я делаю следующее, когда пользователь рисует линию:
- (void)drawLineFromPoint:(CGPoint)startPoint toPoint:(CGPoint)endPoint
{
// Register the undo operation.
[[[managedObjectContext undoManager] prepareWithInvocationTarget:self]
removeObjectWithIndex:nextObjectIndex];
// Draw the line object.
[self drawLineObjectWithIndex:nextObjectIndex fromPoint:startPoint toPoint:endPoint];
// Save the new object to the data model.
[MyCoreDataHelper saveLineObjectWithIndex:nextObjectIndex fromPoint:startPoint toPoint:endPoint];
nextObjectIndex++;
}
Когда я приду отменить это действие, будет ли запущен вызов и , изменилась ли модель соответствующим образом? Или эта ситуация требует, чтобы я отказался от встроенной системы отмены контекста управляемого объекта и развернул свою собственную, используя NSUndoManager
, включая собственное удаление и редактирование модели данных? Если я не могу сказать, что в действительности отменяет встроенная функция отмены / восстановления, похоже, что это может стать ужасно грязным и сложным ...
Редактировать: Я подозреваю (если бы идея выше работала), мне нужно было бы обернуть ее в группу отмены, чтобы моя зарегистрированная операция отмены была сгруппирована с изменениями модели данных?
Другое редактирование: Кроме того, могу ли я гарантировать порядок, в котором будут выполняться действия по отмене? Другими словами, если я позвоню undo
после того, как изменения основных данных будут сохранены, и мое действие отмены зарегистрировано, могу ли я быть уверенным, что удаленная сущность будет восстановлена до того, как будет вызвано мое действие отмены?