muito interessante sua solução. não testei ainda e tenho umas dúvidas
que com certeza vou perguntar depois, mas ontem junto do travesseiro
tive uma outra idéia. seria possível extender um loader e passar o
parâmetro que preciso pra ele? por exemplo:
setarIconesRecursivo(dataProvider:ArrayCollection):void{
for(var i:uint=0; i<dataProvider.length;i++){
if(dataProvider[i].icone != null){
loaderCustomizado = new LoaderCustomizado();
loaderCustomizado.parametroCustomizado =
dataProvider[i];
loaderCustomizado.contentLoaderInfo.addEventListener(Event.COMPLETE,
getBitmapData);
loaderCustomizado.loadBytes(dataProvider[i].icone);
}
}
}
private function getBitmapData(evt:Event):void{
//aquí pegar o valor de parametroCustomizado
}
Vou testar isso agora mesmo.
Bruno, não dá tempo de estudar um framework cara. Gostaria, mas o
projeto anda rápido. Quem sabe no futuro. Valeu.
On 18 out, 12:29, Fredy Gadotti <[email protected]> wrote:
> Você poderia fazer o seguinte:
>
> - declarar uma variável inteira na sua classe para controlar o índice de
> processamento e iniciar como 0
> - adicionar um event listener para sua função se processamento recursivo
> - ao terminar seu processamento recursivo, incrementar o índice e disparar
> evento para processar o próximo
> - terminando de varrer tudo, resetar o índice para 0 novamente
>
> Pseudo-código:
>
> private var processIndex:uint = 0;
>
> protected function startUp():void {
> addEventListener(MyEvent.DO_STEP, stepHandler);
>
> }
>
> private function stepHandler(event:MyEvent):void {
> dataProvider.getItemAt(processIndex);
>
> // Alguma lógica
>
> asyncFunction();
>
> }
>
> private function asyncFunction():void {
> // Faz processamento
> processIndex++;
> dispatcheEvent(new MyEvent(MyEvent.DO_STEP));
>
> }
>
> Sacou a moral do negócio?
> 2011/10/18 Leonardo Oliveira <[email protected]>
>
>
>
>
>
>
>
> > obrigado pela resposta Fredy. cara, a situação que tenho é um pouco
> > diferente. comentei no código. o trecho é este:
>
> > private function
> > setarIconesRecursivo(dataProvider:ArrayCollection):void{
> > for(var i:uint=0; i<dataProvider.length;i++){
> > if(dataProvider[i].icone != null){
> > //disparo um evento customizado com o ítem do tree
> > que vai receber
> > o ícone
> > //foi a forma que encontrei de saber qual
> > elemento vai receber o ícone dentro do getBitmapData
> > //mas se houver uma maneira mais inteligente
> > de passar parâmetro para um handler gostaria de saber
> > evento = new EventLoadCustom("customEvent");
> > evento.evtItemTree = dataProvider[i];
> > dispatchEvent(evento);
> > //adiciono um handler para o loader e caggego os
> > bytes do bytearray
> > (dataProvider[i].icone:ByteArray)
> > loader = new Loader();
>
> > loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
> > getBitmapData);
> > loader.loadBytes(dataProvider[i].icone);
> > }
> > if(dataProvider[i].children != null){
>
> > setarIconesRecursivo(ArrayCollection(dataProvider[i].children));
> > return;
> > }
> > }
> > }
>
> > private function getBitmapData(evt:Event):void{
> > var conteudo:* = loader.content;
> > bitmapData = new BitmapData(conteudo.width,conteudo.height,true,
> > 0x00000000);
> > var matriz:Matrix = new Matrix();
> > bitmapData.draw(conteudo, matriz,null,null,null,true);
> > //esse RuntimeBitmapAsset.getClass vai retornar o BitmapData como
> > Class, que é o parâmetro esperado pelo setItemIcon
> > var icone:Class = RuntimeBitmapAsset.getClass(bitmapData);
> > //agora posso setar o ícone no item do evento disparado
> > _menuTree.setItemIcon(evento.evtItemTree, icone, null);
> > }
>
> > o problema é que quando disparo o evento customizado e carrego o
> > loader a execução não passa para o handler, mas continua no loop, ou
> > seja, o evento customizado envia outro ítem e o loader carrega outro
> > ícone e assim sucessivamente até o último elemento do loop. então só
> > vou conseguir entrar no handler no último ítem do loop por isso
> > somente o último elemento do tree com ícone vai receber a imagem.
> > então como resolver isto?
>
> > On 18 out, 09:30, Fredy Gadotti <[email protected]> wrote:
> > > Ele só é assíncrono para chamadas remotas e alguns outros casos
> > especiais.
> > > Esse código que você mandou é síncrono.
>
> > > Não seria que você gostaria de fazer?
>
> > > if (i % 2 == 0){
> > > // função
>
> > > }
>
> > > Att,
>
> > > Fredy
>
> > > 2011/10/18 Leonardo Oliveira <[email protected]>
>
> > > > eu sei que o flex é assíncrono, portanto se estou em um loop e dentro
> > > > do loop chamo uma outra função, ele vai terminar o loop primeiro e
> > > > depois chamar a função. existe uma forma de forçar o processamento
> > > > síncrono no flex? a situação é esta (apenas exemplificando):
>
> > > > private function teste():void{
> > > > for(var i:uint=0; i<10; i++){
> > > > if(i/2==0){
> > > > teste2(i); //chamar função teste2 passando o número par
> > > > }
> > > > }
> > > > }
>
> > > > private function teste2(param:uint):void{
> > > > //faz alguma coisa com param
> > > > }
>
> > > > como se fosse assim:
> > > > private function teste():void{
> > > > for(var i:uint=0; i<10; i++){
> > > > if(i/2==0){
> > > > //faz alguma coisa com i
> > > > }
> > > > }
> > > > }
>
> > > > --
> > > > Você recebeu esta mensagem porque está inscrito na lista "flexdev"
> > > > Para enviar uma mensagem, envie um e-mail para
> > [email protected]
> > > > Para sair da lista, envie um email em branco para
> > > > [email protected]
> > > > Mais opções estão disponíveis emhttp://groups.google.com/group/flexdev
>
> > --
> > Você recebeu esta mensagem porque está inscrito na lista "flexdev"
> > Para enviar uma mensagem, envie um e-mail para [email protected]
> > Para sair da lista, envie um email em branco para
> > [email protected]
> > Mais opções estão disponíveis emhttp://groups.google.com/group/flexdev
--
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para [email protected]
Para sair da lista, envie um email em branco para
[email protected]
Mais opções estão disponíveis em http://groups.google.com/group/flexdev