Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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, то откладывать запуск по таймеру и перепроверять. Что думаете?
__________________
Не сломано - не чини!

Старый 16.02.2018, 13:46
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Ну а что мешает по событию "притормозить", притормозить и выполнение вычислений в модели?
__________________
Ко мне можно и нужно обращаться на ты)

Старый 16.02.2018, 14:19
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 3  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Ничо не понял. %) Почему модель что-то там без спроса делает? Дёрнул её контроллер, сформировала она массив инструкций, пришел он во вью, отобразился. Не понял, почему модель потом сама без спроса что-то опять шлет?
__________________
while(live()) { hope(); }

Старый 16.02.2018, 14:48
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 4  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
а что асинхронная реакция модели недопустима?

Старый 16.02.2018, 15:21
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 5  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
а что асинхронная реакция модели недопустима?
Ну как бэ... все таки модель это коробка без мозгов, самой че нить варить внутри без спросу как то не по трушному, контроллер обычно запускает процессы в модели, а не само по себе запускается по таймеру например. Ну тут на вкус и цвет
__________________
Марк Tween

Старый 16.02.2018, 15:28
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 6  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
Сообщение от in4core Посмотреть сообщение
Ну как бэ... все таки модель это коробка без мозгов, самой че нить варить внутри без спросу как то не по трушному, контроллер обычно запускает процессы в модели, а не само по себе запускается по таймеру например. Ну тут на вкус и цвет
А где же тогда бизнес логика должна находиться?В контроллере?

Старый 16.02.2018, 15:47
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Даже если допустить, что модель асинхронно что-то там доделыват, то потом, когда она прислала событие, вьюшка уже должна решить, а нужно ли эти данные отображать. Я вот в упор не вижу проблемы
__________________
Ко мне можно и нужно обращаться на ты)

Старый 16.02.2018, 16:45
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 8  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Ну а что мешает по событию "притормозить", притормозить и выполнение вычислений в модели?
Ну вроде как Модель должна быть независима от Вью. В теории.

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


Последний раз редактировалось Appleman; 16.02.2018 в 16:57.
Старый 23.02.2018, 00:31
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 9  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Appleman Посмотреть сообщение
Друзья!
Столкнулся с непредвиденной проблемой. У меня связка "Модель - Вью" работает следующим образом. Предусмотрен массив инструкций для Вью: вывести текст, изменить задник, добавить объект на передний план и т.п. Этот массив наполняется в Модели и записывается в переменную. Когда Модель посылает событие PROCESS_STATE_ARRAY, Вью запускает метод <skipped>
Appleman, в парадигме MVC модель ничего не знает о вью. Поэтому "Предусмотрен массив инструкций для Вью" совершенно недопустим. Там такой небольшой замут, что вьюх может быть много (очень много и разных) и совсем не того они бы ждали от модели.

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

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


Последний раз редактировалось dimarik; 23.02.2018 в 01:51. Причина: some exictence
Создать новую тему Ответ Часовой пояс GMT +4, время: 20:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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