我有一个漫长而忙碌的 for 循环,它应该在舞台上迭代地添加元素。由于执行整个循环需要几秒钟(i = 1:N),我只想在每个循环处刷新阶段,以便在循环到达其终点(N)之前显示输出。每次迭代都应该在下一次迭代开始之前添加一个可显示的元素。为此,我写了以下内容
for(var i:int = 0; i < 280; i++){
addElement(...);
validateNow();
}
但它不像我想要的那样工作。请问有人有解决方案吗?
我有一个漫长而忙碌的 for 循环,它应该在舞台上迭代地添加元素。由于执行整个循环需要几秒钟(i = 1:N),我只想在每个循环处刷新阶段,以便在循环到达其终点(N)之前显示输出。每次迭代都应该在下一次迭代开始之前添加一个可显示的元素。为此,我写了以下内容
for(var i:int = 0; i < 280; i++){
addElement(...);
validateNow();
}
但它不像我想要的那样工作。请问有人有解决方案吗?
您需要将这项冗长的工作分开,以便它可以在多个帧上进行。执行代码时,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()
正在做的事情)来做同样的事情。
参考资料: