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

あなたの問題を理解したかどうかはよくわかりませんが、内側のループに対応するリスナーを追加するだけのようです。

 //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

これには私も悩まされましたが、まだメモリに存在しないものに対して何かを行うことはできず、これらの読み込み操作にはかなりの時間がかかる可能性があることを認識する必要があります。シングルスレッドのスタックであるため、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

この問題をかなり処理するサードパーティのライブラリを使用して問題を解決しました。

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

于 2013-02-19T12:17:57.457 に答える