Appleman |
15.02.2018 19:03 |
Дождаться окончания одного действия перед запуском следующего
Друзья!
Столкнулся с непредвиденной проблемой. У меня связка "Модель - Вью" работает следующим образом. Предусмотрен массив инструкций для Вью: вывести текст, изменить задник, добавить объект на передний план и т.п. Этот массив наполняется в Модели и записывается в переменную. Когда Модель посылает событие PROCESS_STATE_ARRAY, Вью запускает метод:
Код AS3:
private function processStateArray(event:Event) : void // Получает массив состояний и запускает его разбор
{
_stateArray = _model.stateArray;
dispatchEvent(new Event(PARSE_STATE_ARRAY_BLOCK));
}
Посылаемое событие запускает метод анализа и выполнения очередной инструкции:
Код AS3:
private function parseStateArrayBlock(event: Event) : void
// Вынимает и анализирует очередной блок из массива и обновляет вывод. По окончании отправляет событие.
{
if (!_stateArray.length) dispatchEvent(new Event(STATE_ARRAY_PROCESSED));
else
{
// Тут разбирается инструкция и по результату запускается событие разбора следующей инструкции
dispatchEvent(new Event(PARSE_STATE_ARRAY_BLOCK));
}
Как видно из кода, когда все инструкции выполнены, Вью посылает событие STATE_ARRAY_PROCESSED, а Контроллер запускает по нему у Модели метод удаления всех инструкций _stateArray.
Всё бы неплохо. Но выяснилось, что на практике всё равно происходит наложение. Например, пользователь получил порцию текста, во Вью с очередным блоком поступила инструкция притормозить, пока пользователь не кликнет. Но в это время в Модели вычисления продолжают выполняться, массив _stateArray наполняется новыми инструкциями и новое событие PROCESS_STATE_ARRAY создаёт кашу в выводе.
Как с этим бороться? Единственное, что пока приходит в голову, это не ограничиваться событием STATE_ARRAY_PROCESSED, а завести ещё какой-нибудь флаг "inProgress", который будет принимать значение true в момент запуска метода processStateArray и false, когда все инструкции выполнены. Соответственно, если inProgress = true, то откладывать запуск по таймеру и перепроверять. Что думаете?
|