2013-02-16 2 views
1

Я создал процедуру для создания эскизов и Heres основной поток:асинхронная генерация миниатюр

1) get all jpg url from directory 
2) iterate all the url 
    2.1) load url into a bitmap using URLRequest 
    2.2) resize the bitmap to small size 
    2.3) encode the bitmap into jpg 
    2.4) write the jpg into a file 
3) update list dataprovider with thumb url and refresh 

это работает 1 файл, но не на 2 или более файлов, и это клюв шаги 2,1 до 2,4 заключен в статическая функция с асинхронными методами. 2.1 - async, resize - async, encode - асинхронный, каждый из которых вложен через анонимную функцию, ожидающую завершения события.

К тому времени, когда следующая итерация достигнет шага 2.1, он передаст новый url, и методы обратного вызова из предыдущей итерации будут использовать его.

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

ответ

0

Как вы сказали, ваши функции должны сохранять свое состояние, им нужны общие данные для всей последовательности операций. Именно поэтому классы были изобретены.

Вы не будете жалеть об использовании этого «тяжелого» подхода, поскольку adobe использует его с AsyncToken и так далее. Если этот код не является узким местом производительности вашей программы, вы обязательно будете использовать классы: это сделает ваш код более понятным.

Однако, если вы чувствуете, что производительность важна здесь, вы можете сделать анимированные итерации, чтобы начать асинхронные операции: если достигнуто максимальное количество начатых операций, то не начинайте новую операцию до тех пор, пока одна из них не будет завершена. В этом случае вы можете создать пул таких классов и повторно использовать их.

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

Вы также можете действовать так же, как и сейчас, просто не начинайте новую операцию до тех пор, пока предыдущий не будет выполнен на 100%. Это особый случай предыдущего варианта, в этом случае ваш основной класс выступает в качестве предлагаемого нового класса, он повторно использует себя и максимальный предел операций равен 1.

+0

спасибо. Я решил это, просто связав события event.COMPLETE и реструктурируя свой код. Я не хотел создавать какую-то структуру, такую ​​как последовательность/секвентируемый класс, и не создавать экземпляр тяжелого объекта, поэтому я сделал самую простую реализацию, о которой я мог думать. – StephenNYC

Смежные вопросы