Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Дождаться окончания одного действия перед запуском следующего (http://www.flasher.ru/forum/showthread.php?t=215077)

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, то откладывать запуск по таймеру и перепроверять. Что думаете?

caseyryan 16.02.2018 13:46

Ну а что мешает по событию "притормозить", притормозить и выполнение вычислений в модели?

ZergMaster 16.02.2018 14:19

Ничо не понял. %) Почему модель что-то там без спроса делает? Дёрнул её контроллер, сформировала она массив инструкций, пришел он во вью, отобразился. Не понял, почему модель потом сама без спроса что-то опять шлет?

undefined 16.02.2018 14:48

а что асинхронная реакция модели недопустима?

in4core 16.02.2018 15:21

Цитата:

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

undefined 16.02.2018 15:28

Цитата:

Сообщение от in4core (Сообщение 1204261)
Ну как бэ... все таки модель это коробка без мозгов, самой че нить варить внутри без спросу как то не по трушному, контроллер обычно запускает процессы в модели, а не само по себе запускается по таймеру например. Ну тут на вкус и цвет

А где же тогда бизнес логика должна находиться?В контроллере?

caseyryan 16.02.2018 15:47

Даже если допустить, что модель асинхронно что-то там доделыват, то потом, когда она прислала событие, вьюшка уже должна решить, а нужно ли эти данные отображать. Я вот в упор не вижу проблемы

Appleman 16.02.2018 16:45

Цитата:

Сообщение от caseyryan (Сообщение 1204258)
Ну а что мешает по событию "притормозить", притормозить и выполнение вычислений в модели?

Ну вроде как Модель должна быть независима от Вью. В теории.

На самом деле уже нашёл красивое решение. Чуть-чуть изменил код метода processStateArray(event:Event), получающего массив инструкций. Добавил условие, что если массив на момент запуска пустой, то обрабатывается как есть. А если нет (т.е. массив инструкций находится в процессе обработки), то новые инструкции просто добавляются в конец массива, и новое событие на обработку не запускается (именно из-за повторного запуска этого события начиналась куча мала). Всё работает прекрасно. И можно в любой момент "подбрасывать дровишек" для Вью.

dimarik 23.02.2018 00:31

Цитата:

Сообщение от Appleman (Сообщение 1204255)
Друзья!
Столкнулся с непредвиденной проблемой. У меня связка "Модель - Вью" работает следующим образом. Предусмотрен массив инструкций для Вью: вывести текст, изменить задник, добавить объект на передний план и т.п. Этот массив наполняется в Модели и записывается в переменную. Когда Модель посылает событие PROCESS_STATE_ARRAY, Вью запускает метод <skipped>

Appleman, в парадигме MVC модель ничего не знает о вью. Поэтому "Предусмотрен массив инструкций для Вью" совершенно недопустим. Там такой небольшой замут, что вьюх может быть много (очень много и разных) и совсем не того они бы ждали от модели.

Простой пример. У тебя есть две топографические карты одной и той же местности (эта местность на самом деле для нас модель) на экране: одна большая, на весь экран, а в левом верхнем углу маленькая, примитивная. Этот пример покрывает 90% бегалок AAA.

Хех, и мир всегда работает, показывает что сейчас происходит. А знаешь почему? Потому что верхней левой вьюхе не нужен "массив инструкций для Вью". Ведь ты его сделал только для "главной вью".


Часовой пояс GMT +4, время: 02:21.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.