![]() |
Чудеса асинхронного исполнения.
Кратко опишу последовательность событий:
1. Вьюер инициализирует контролл, сохраняет на него ссылку. 2. Контролл инициализирует модель, отдает ссылку на модель во вьюер. 3. Вьюер принимает ссылку вешает слушателя на событие готовности данных в модели. 4. Конролл инициализирует датапровайдер отвечающий за доставку данных. 5. Контролл сообщает модели данные извлеченные датапровайдером из sharedobject. 6. Модель извлекает данные из полученного ByteArray и, по сути, инициализирует объект VO. 7. Модель поручает статику подготовить два вида данных (распарсить строку, а также подготовить html-строку для текст.поля). 8. Модель диспатчит готовность данных для вьюера. 9. Вьюер готовит на основе полученных данных шесть, относительно непростых виз.объектов, при инициализации последних, в них, уже, готовятся другие виз.объекты, что требует некоторых доп. вычислений. 10. Вьюер обращается к контроллу для инициализации прослушивания его эл-тов. В результате последнего возникает ошибка: Контролл равен null (!!!) Как может быть такое? |
Как то слишком абстрактно без кода... Но так сходу вопросы возникают - Может где то в процессе контролл обнуляется? И что в дебаггере пошагово по контроллу видно, именно в момент возникновения ошибки?
|
Это было бы очень простым ответом )
Нет, проблема решается следующим образом: после шага №2 контролл устанавливает слушатель на вхождение в следующий кадр. И тогда всё нормально исполняется. Да и трейсы показывают последовательное исполнение, не параллельное. Значит, контролл нигде не обнуляется. В чем же может быть дело? ЗЫ. Код и трейсы могу привести, просто его много получается, на словах проще. Если никто сходу не сможет ответить приведу и код. |
ccылку на контрол во вьювере сделать сеттером и последить кто его менят в нул
|
Цитата:
|
Цитата:
|
ссылка на контролл есть только у одного класса - у гл.класса приложения, да и тому она нафиг не нужна - почикал (код не рефакторенный) , однако это ничего не изменило, трейсы показывают последовательное исполнение:
Код:
1324592402281. DragTheWord, init, : в частности строка "DragTheWord, init," указывает на метод init() класса DragTheWord(). Видно, что первая и последние две строки относятся к одному и тому же методу, первая - до инициализации контролла, последние здесь же , в этом же методе, но уже после инициализации. Строка инициализации выглядит так: Код AS3:
Добавлено через 2 минуты Цитата:
|
Цитата:
|
собирите минимальный приме, прям интересно посмотрить
|
Да, речь про MVC и есть. Только так как я его понимаю. Главный класс - по сути просто фасад. Однако из за специфики флеша, он и вьюер. Оправдаться могу только тем, что они ничего и не делает, кроме старта приложения и создания подвьюх на старте.
|
Цитата:
|
А gc его съесть не мог?
|
Цитата:
Цитата:
UPD: Прошу простить, если кого обидел своей крамольностью. Здесь, выше, и далее MVC as Mein MVC [+corrupted] |
Цитата:
|
Цитата:
|
Цитата:
ведь это чтож получается, фигня полная получается, ведь не важно же что там происходит между 1 и 10 пунктами (если конечно никто там спецом не занимается убийством контролов) или Вьюер таки не сохраняет ссылку.. в общем, хотелось бы пощупать действующий макет явления |
А почему бы не сделать по фэн-шую? Ну, фактически, то, что предложил Zebestov.
Инициализируем контроллер, который в свою очередь создает модель и вьюху, вьюхе даем ссылку на модель либо интрфейс, который она реализует. |
fish_r
Вы уже всех заинтересовали, иcходники в студию! |
Вложений: 1
В общем, как и предполагал, к последовательному выполнению приводит обращение SharedObject.getLocal().
По прежнему, однако, остается загадкой - почему так? В аттаче пример который, как мне кажется, более менее иллюстрирует ситуацию (для FD). |
ыыы :)
Дак присвоения _shObject еще не произошло, пока отрабатывает конструктор SharedObjProvider :) Добавлено через 3 минуты Если init() убрать из конструктора SharedObjProvider, а код в Main модифицировать так: Код AS3:
Цитата:
|
Т.е. несмотря на то, что init() не возвращает значение, и поэтому программе не нужно дожидаться результатов вызова, инициализация не закончится до тех пор пока не отработают все вызовы всех методов в инициализаторах всех нижележащих классах? Да. Это несколько меняет моё представление о последовательности работы приложения.
|
Код AS3:
|
Цитата:
«Чудеса синхронного исполнения» было бы уместнее в названии, кстати. |
А хотите еще одну интересную штуку? =) Вот смотрите:
Код AS3:
И мы получаем вот такую картину: сначала создаем объект несуществующего класса, потом этот класс инициализируем в рантайме, а потом, получается назначаем этот класс нужным объектам. Ну или я не знаю как еще это можно объяснить =) (с) Smithy |
глум, там что-то другое:
Код AS3:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
| Часовой пояс GMT +4, время: 09:00. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.