Основные данные Отменить / Повторить - Действие зависит от того, что было отменено - PullRequest
2 голосов
/ 18 января 2012

У меня есть довольно сложная модель данных в приложении для iPad (приложение для рисования OpenGL), и я работаю над реализацией функций отмены / возврата. Мне нравится тот факт, что Core Data бесплатно отменяет изменения модели данных, но я не знаю, будет ли мне достаточно встроенных функций.

Я видел множество примеров отмены / повтора, реализованных в приложениях для рисования, однако они обычно делают следующее:

  1. Скажите контекст управляемого объекта undo.
  2. Перерисовать все на странице измененной модели данных.

Это ужасно неэффективно - в моем приложении мне нужно иметь возможность выполнить действие для отмены, основываясь на конкретном объекте, который «отменяется», и часто это означает обновление только части холста.

Так что мой вопрос таков: могу ли я зарегистрировать свои собственные операции отмены и использовать их вместе со встроенными отменами? Например, скажем, я делаю следующее, когда пользователь рисует линию:

- (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 после того, как изменения основных данных будут сохранены, и мое действие отмены зарегистрировано, могу ли я быть уверенным, что удаленная сущность будет восстановлена ​​до того, как будет вызвано мое действие отмены?

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Знаете ли вы, можно ли определить, какие данные были изменены после отмены?

Почему бы вам не проверить уведомления для NSManagedObjectContext (Apple Docs)

Специально посмотрите на уведомление userInfo с ключами NSInsertedObjectsKey, NSUpdatedObjectsKey и NSDeletedObjectsKey.

Также, могу ли я гарантировать порядок, в котором будут выполняться действия по отмене?

Ну, отмена работает через стек (последний пришел, первый вышел), поэтому вы " должны " иметь возможность отслеживать ваши шаги. Очевидно, вы должны быть очень точны в том порядке, в котором вы регистрируете свои отмены, если вы хотите, чтобы вещи разворачивались правильно. Несколько строк кода, которые помогают мне отследить стек отмены, чтобы увидеть, что скрывается за завесой тайны:

id undoStack, redoStack;
object_getInstanceVariable(undoManager, "_undoStack", &undoStack);
object_getInstanceVariable(undoManager, "_redoStack", &redoStack);
NSLog(@"%@", [undoStack description]);
NSLog(@"%@", [redoStack description]);

(Пропишите на этот сайт указанный выше код)

0 голосов
/ 27 января 2012

Используйте структуру flyweight. Обычно используется для операций отмены / возврата.То, что вы просите, требует от вас сделать это самостоятельно.

Flyweights может хранить столько данных, сколько вы хотите, и вы можете удалить их из последовательности отмены, когда захотите.Например, ваши весы могут сохранять данные пикселей перед каждым редактированием.Это заняло бы большие объемы памяти, но вы могли бы легко что-то отменить, не перерисовывая всю сцену.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...