0

作为一名 PHP 程序员,我非常习惯于程序流程逐行进行的事实,如果我调用必须返回某个值的 function1(),我知道程序不会继续,直到该函数返回。

现在,我正在使用 AIR 开发一个 AS3 应用程序,如果满足某些条件,我需要下载一些图像,不知道有多少,所以我使用这样的 For:

for (var w:int=0; w < newData_array[2]['content'].length; w++ ) {
    for (var j:int=0; j < oldData_array[2]['content'].length; j++ ) {
        if((oldData_array[2]['content'][j]['id'] == newData_array[2]['content'][w]['id']) &&  (oldData_array[2]['content'][j]['last_mod'] != newData_array[2]['content'][w]['last_mod'])){
            //need to download a image...
        }
    }       
}

如您所见,我只是比较每个数组中的每个元素(newData_arrayoldData_array)。如果条件满足,我需要下载一些东西,因为我使用的是URLloader并且你知道这个函数是异步的,添加一个监听器,当下载完成时会触发一个事件,问题很清楚,因为urlloader 不会停止 for 循环(就像我在 PHP 类似的语言上所期望的那样)我只是要同时下载一堆图像,这会造成灾难,因为我不知道何时保存。所以我无论如何都需要使用监听器,但由于我对这种程序不太习惯,所以我非常卡住。

我对保存到磁盘的例程不感兴趣,那部分已经完成了,我只是想了解我应该如何构建这个算法来完成这项工作。

4

3 回答 3

0

这也让我很恼火,但必须意识到你不能对内存中尚不存在的东西做某事,而且这些加载操作可能需要相当长的时间。作为单线程堆栈,Flash Player 的加载操作将要求整个界面在加载期间冻结(如果仅限于循环)。

显然,循环中有数据可用于指示您对图像执行的操作。我一直在使用的解决方案是创建一个自定义加载函数来启动加载,并返回一个代理图像。你的循环得到一个容器,你可以自由地将你的图像放在你想要的地方。

同时,您的加载程序侦听器一直在跟踪活动图像加载及其相关代理。加载后,交换图像。

你的循环看起来像这样......

for (var w:int in newData_array[2]['content']) {
    for (var j:int in oldData_array[2]['content']) {
        if ((oldData_array[2]['content'][j]['id'] == newData_array[2]['content'][w]['id']) && (oldData_array[2]['content'][j]['last_mod'] != newData_array[2]['content'][w]['last_mod'])){
            var proxy:MovieClip = loadImage("image/path.jpg");
            // Do stuff to proxy.
        }
    }    
}

你的函数+监听器看起来像这样......

var proxies:Object = {};
function loadImage(path:String):MovieClip {
    // load Image
    var proxy:MovieClip = new MovieClip();
    proxies.path = proxy;

    // Load Image
}

function imageLoaded(e:Event):void {
    // Once loaded, use the filename as the proxy object's key to find the MovieClip to attach the image.
    proxies[e.data.loaderInfo.filename].addChild(e.data);
}

这只是我的想法,所以你需要找到实际的变量名,但我希望这是有道理的。

于 2013-02-18T18:32:54.180 回答
0

我不确定我是否理解您的问题,但在我看来,您只是在内部循环中添加了相应的侦听器。

 //take care this is pseudocode

 var parent = ... // some stage object
 for (var w:int=0; w < size1; w++ ) {
     for (var j:int=0; j < size2; j++ ) {
         if(some_condition){
             request = new URLRequest(getNextImagePath();
             urlLoader = new URLLoader();
             urlLoader.addEventListener(Event.COMPLETE, onComplete);
             urlLoader.load(request);
         }
     }       
 }

 function onComplete(event:Event) {
     parent.addChild(createImageFromData(this.data));
 }
于 2013-02-19T09:26:17.837 回答
0

我使用一个可以很好地处理这个问题的第三方库解决了这个问题。

https://github.com/arthur-debert/BulkLoader

于 2013-02-19T12:17:57.457 回答