Базовые данные отменяют объединение для действия, охватывающего несколько циклов цикла выполнения - PullRequest
1 голос
/ 21 июля 2010

У меня есть приложение UIKit на основе Core Data, которое позволяет пользователю перетаскивать объекты по экрану.Во время перетаскивания объекта я обновляю его атрибут позиции при каждом событии touchesMoved:.Чтобы поддержать отмену операции перетаскивания за один раз, я начинаю новую группу отмены в начале перетаскивания и заканчиваю группу, когда пользователь поднимает палец.

Чтобы сохранить память и быстро отменить операции,Я хочу объединить данные отмены, относящиеся к операции перетаскивания, но Core Data делает это трудным.Проблема в том, что processPendingChanges вызывается в конце каждого цикла цикла выполнения, и это заставляет Core Data подать новую запись отмены для изменения положения, которое произошло в этой итерации.Операция перетаскивания может легко накапливать сотни таких записей отмены, все из которых, кроме первой, не нужны.

Есть ли способ для меня, чтобы продолжать использовать волшебную встроенную поддержку отмены Core Data, но без потери драгоценной памятина таких дубликатах отменить записи?Мне нравится, что мне не нужно заботиться о поддержании согласованности графов объектов при операциях отмены и повторения, но неспособность правильно обрабатывать эти непрерывные обновления атрибутов, похоже, является демонстрацией.

Ответы [ 2 ]

3 голосов
/ 22 июля 2010

Я думаю, установка менеджеров отмены setGroupsByEvent: будет делать то, что вы хотите.

Устанавливает логическое значение, которое указывает будет ли получатель автоматически групповые операции отмены во время бега петля. Если ДА, получатель создает отменять группы вокруг каждого прохода цикл выполнения; если НЕТ, это не так.

Более чистое решение может заключаться в том, чтобы просто не фиксировать положение объектов в модели данных до конца события перетаскивания.

0 голосов
/ 24 июля 2010

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

Если у вас включен groupsByEvent, вам нужно будет сохранитьИмейте в виду, что менеджер отмены игнорирует все группирующие сообщения, когда регистрация выключена, включая то, которое автоматически завершает неявную группу в конце события.Поэтому, если вы планируете оставить регистрацию выключенной в конце цикла выполнения, вам придется вручную вручную закрывать неявную группу:

[moc processPendingChanges];
while ([moc.undoManager groupingLevel])
    [moc.undoManager endUndoGrouping];
[moc.undoManager disableUndoRegistration];

После завершения жеста перетаскивания вы можете снова включитьотмените регистрацию с помощью следующего кода:

[moc processPendingChanges];
[moc.undoManager enableUndoRegistration];

Это решение работает, но оно немного запутанно.Предложенный TechZen намного чище: не обновляйте атрибуты модели, пока не будет сделан жест перетаскивания.

...