Da uma olhada na documentação do SWIZ framework, www.swizframework.org e procura Chain events...
Bruno Sent from my iPhone On 18/10/2011, at 12:29 PM, 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 em http://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 -- 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
