0

我有一个漫长而忙碌的 for 循环,它应该在舞台上迭代地添加元素。由于执行整个循环需要几秒钟(i = 1:N),我只想在每个循环处刷新阶段,以便在循环到达其终点(N)之前显示输出。每次迭代都应该在下一次迭代开始之前添加一个可显示的元素。为此,我写了以下内容

for(var i:int = 0; i < 280; i++){
 addElement(...);
 validateNow();
} 

但它不像我想要的那样工作。请问有人有解决方案吗?

4

1 回答 1

0

您需要将这项冗长的工作分开,以便它可以在多个帧上进行。执行代码时,Flash/Flex 不会更新屏幕。查看 Flash 的弹性赛道以帮助了解原因。Flex 组件生命周期还在其之上添加了另一层。顺便说一句,调用validateNow()可能在计算上很昂贵,可能会使您的循环花费更长的时间:)

有许多方法可以分解循环中的工作。

这是一个使用callLater()的简单示例:

private function startWorking():void
{
    // create a queue of work (whatever you are iterating over)
    // in your loop you're counting to 280, you could use a
    // simple counter variable here instead
    var queue:Array = [ a, b, c];
    callLater(doWork, [ queue ] );
}

private function doWork(workQueue:Array):void
{
    var workItem:Object = workQueue.shift();
    // do expensive work to create the element to add to screen
    addElement(...);
    if (workQueue.length > 0)
        callLater(doWork, workQueue);
}

您可能希望一次处理超过 1 个项目。您也可以使用 ENTER_FRAME 事件而不是callLater()(本质上,这就是callLater()正在做的事情)来做同样的事情。

参考资料

于 2013-05-26T01:23:02.800 回答