Как сохранить действия пользователя iOS, чтобы сбалансировать производительность и обеспечить несколько отмен? - PullRequest
0 голосов
/ 11 июня 2011

У меня есть изображение для рисования пальцем на одном экране моего приложения.Когда пользователь касается вида, я сохраняю изображение текущего вида, чтобы при необходимости отменить его позже.Чтобы уменьшить задержку, я запускаю его с помощью центральной диспетчеризации, что-то вроде

TouchesBegan method...
dispatch_async(dispatch_get_main_queue(), ^{
    [self saveCurrentState];
});

. Я пробовал разные подходы для этого saveCurrentState, то есть сохранения образа на диск, в основные данные или вобъем памяти.Последний метод - тот, который работает лучше всего, но он удваивает использование памяти и опасно приводит к падению приложения из-за использования памяти.Первые два метода (сохранение на диск или в основные данные) приводят к такой большой задержке, что если пользователь рисует несколько линий, удаляя и касаясь экрана в быстрой последовательности, некоторые линии не будут отрисовываться, потому что программа занята сохранением одного изображения, покаприходит заказ на сохранение другого.

Я попытался создать последовательную очередь или использовать одну из 3 основных очередей GCD с высоким приоритетом, но результат всегда одинаков.

Как я могу решить это?Какой лучший способ сделать это?

спасибо.

Ответы [ 2 ]

2 голосов
/ 11 июня 2011

Нужно ли сохранять изображение на диск при каждом редактировании? Может быть, вы могли бы создать резервную копию действий пользователя и сохранить их. Что-то вроде:

Line(12, 24, 500, 24)
1 голос
/ 11 июня 2011

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

Таким образом, после записи плиток, которые изменили последнюю итерацию, пометьте все плитки как чистые.Когда пользователь взаимодействует с доской, отметьте плитки, которые изменились, как грязные.После того, как пользователь завершит свое действие, выведите все грязные плитки в параллельную очередь.Повторите это снова.

Вы должны будете использовать те же самые метаданные, что и при смене тайлов, чтобы вы могли восстановить плату на заданной итерации, чтобы вы могли поддерживать операции отмены / повторения.

В качестве альтернативы вы можете улучшить подход к путям, сохранив изображения на важных этапах, например, через каждые 5-10 действий, чтобы отмена / повтор не была такой дорогой, а запись - тоже.

...