цепочка событий или стек слишком длинный as3 - PullRequest
0 голосов
/ 06 января 2012

Я не думаю, что «Цепочка» - правильное слово здесь. Но это моя проблема:

У меня есть очередь из 1000 элементов, которые необходимо загрузить.

Я использую загрузчик с событием: Event.COMPLETE вызывает функцию. Эта функция создает загрузчик с событием, которое в Event.COMPLETE вызывает эту функцию снова ... и т. Д.

Это никогда не было проблемой. Я даже не знал, что это означало, что все это будет храниться в памяти.

На iOS это становится проблемой. На определенном максимуме это просто говорит мне, что я достиг предела. Поэтому на 500 я вставляю таймер, чтобы снова начать вызывать эти функции с «уровня 0».

Теперь я думаю, что моя архитектура здесь неправильная. Как лучше это сделать?

Ответы [ 3 ]

0 голосов
/ 07 января 2012

в первую очередь: зачем вам нужно загружать 1000 элементов?
вам также нужно показывать эти элементы одновременно?

предложение 1)
возможно объединение их в один* .zip-файл и загрузка только этого одного файла - опция ... (http://ntt.cc/2008/01/19/actionscript-class-library-fzip.html)
распакуйте его и получите доступ к файлам локально.

рекомендация 2)
если нет, возможно, вы можете использовать повторносуществующий экземпляр Loader после полной загрузки файла.и сохраните результат в другом месте

предложение 3)
возможно, проблема в том, что старые экземпляры Loader не удаляются из памяти.не забудьте удалить все списки событий из Loader, чтобы ГХ мог позаботиться о них.

0 голосов
/ 07 января 2012

https://bugbase.adobe.com/index.cfm?event=bug&id=3071138 К сожалению, пришлось опубликовать это уже несколько раз.Это может быть ошибкой загрузчика.В любом случае цель iOS очень свежая и, вероятно, более глючная, чем остальные.

Это, однако, не ошибка переполнения стека, поскольку обработчики событий, вызываемые в ответ на событие «complete» загрузчика, являются асинхронными(каждый открывает новый кадр стека).Я не уверен, что сейчас можно решить эту проблему.

0 голосов
/ 07 января 2012

Вы по существу используете рекурсивный вызов для выполнения ваших операций, что оставляет память в стеке. (Обычно это рассматривается на более низком уровне в таких языках, как C и C ++.) Вам нужно переписать свои функции как итеративные вызовы, чтобы они автоматически удалялись из стека - вы можете попробовать цикл for или что-то в этом роде.

Опубликуйте свой код - я перепишу альтернативу, которая может работать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...