Показать сообщение отдельно
Старый 15.02.2018, 19:03
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 1  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
По умолчанию Дождаться окончания одного действия перед запуском следующего

Друзья!

Столкнулся с непредвиденной проблемой. У меня связка "Модель - Вью" работает следующим образом. Предусмотрен массив инструкций для Вью: вывести текст, изменить задник, добавить объект на передний план и т.п. Этот массив наполняется в Модели и записывается в переменную. Когда Модель посылает событие 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, то откладывать запуск по таймеру и перепроверять. Что думаете?
__________________
Не сломано - не чини!