|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Дождаться окончания одного действия перед запуском следующего
Друзья!
Столкнулся с непредвиденной проблемой. У меня связка "Модель - Вью" работает следующим образом. Предусмотрен массив инструкций для Вью: вывести текст, изменить задник, добавить объект на передний план и т.п. Этот массив наполняется в Модели и записывается в переменную. Когда Модель посылает событие PROCESS_STATE_ARRAY, Вью запускает метод: private function processStateArray(event:Event) : void // Получает массив состояний и запускает его разбор { _stateArray = _model.stateArray; dispatchEvent(new Event(PARSE_STATE_ARRAY_BLOCK)); } private function parseStateArrayBlock(event: Event) : void // Вынимает и анализирует очередной блок из массива и обновляет вывод. По окончании отправляет событие. { if (!_stateArray.length) dispatchEvent(new Event(STATE_ARRAY_PROCESSED)); else { // Тут разбирается инструкция и по результату запускается событие разбора следующей инструкции dispatchEvent(new Event(PARSE_STATE_ARRAY_BLOCK)); } Всё бы неплохо. Но выяснилось, что на практике всё равно происходит наложение. Например, пользователь получил порцию текста, во Вью с очередным блоком поступила инструкция притормозить, пока пользователь не кликнет. Но в это время в Модели вычисления продолжают выполняться, массив _stateArray наполняется новыми инструкциями и новое событие PROCESS_STATE_ARRAY создаёт кашу в выводе. Как с этим бороться? Единственное, что пока приходит в голову, это не ограничиваться событием STATE_ARRAY_PROCESSED, а завести ещё какой-нибудь флаг "inProgress", который будет принимать значение true в момент запуска метода processStateArray и false, когда все инструкции выполнены. Соответственно, если inProgress = true, то откладывать запуск по таймеру и перепроверять. Что думаете?
__________________
Не сломано - не чини! |
|
|||||
Ничо не понял. %) Почему модель что-то там без спроса делает? Дёрнул её контроллер, сформировала она массив инструкций, пришел он во вью, отобразился. Не понял, почему модель потом сама без спроса что-то опять шлет?
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
а что асинхронная реакция модели недопустима?
|
|
|||||
[+4 06.05.14]
|
Цитата:
__________________
Марк Tween |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
А где же тогда бизнес логика должна находиться?В контроллере?
|
|
|||||
Даже если допустить, что модель асинхронно что-то там доделыват, то потом, когда она прислала событие, вьюшка уже должна решить, а нужно ли эти данные отображать. Я вот в упор не вижу проблемы
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Цитата:
На самом деле уже нашёл красивое решение. Чуть-чуть изменил код метода processStateArray(event:Event), получающего массив инструкций. Добавил условие, что если массив на момент запуска пустой, то обрабатывается как есть. А если нет (т.е. массив инструкций находится в процессе обработки), то новые инструкции просто добавляются в конец массива, и новое событие на обработку не запускается (именно из-за повторного запуска этого события начиналась куча мала). Всё работает прекрасно. И можно в любой момент "подбрасывать дровишек" для Вью.
__________________
Не сломано - не чини! Последний раз редактировалось Appleman; 16.02.2018 в 16:57. |
|
|||||
.
|
Цитата:
Простой пример. У тебя есть две топографические карты одной и той же местности (эта местность на самом деле для нас модель) на экране: одна большая, на весь экран, а в левом верхнем углу маленькая, примитивная. Этот пример покрывает 90% бегалок AAA. Хех, и мир всегда работает, показывает что сейчас происходит. А знаешь почему? Потому что верхней левой вьюхе не нужен "массив инструкций для Вью". Ведь ты его сделал только для "главной вью". Последний раз редактировалось dimarik; 23.02.2018 в 01:51. Причина: some exictence |
Часовой пояс GMT +4, время: 23:25. |
|
« Предыдущая тема | Следующая тема » |
|
|