2013-02-18 4 views
0

Как программист PHP, я очень привык к тому, что поток программы идет по строке, если я вызываю функцию1(), которая должна вернуть некоторое значение. Я знаю, что программа не будет продолжаться до тех пор, пока эта функция возвращает.От синхронного потока до асинхронной дилеммы потока

Теперь им разрабатывает приложение AS3 с помощью AIR, мне нужно, чтобы загрузить некоторые изображения, если некоторые условия выполнены, не знаю, сколько, так что им, используя монетой это:

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... 
     } 
    }  
} 

Как вам можно увидеть im, просто сравнивая каждый элемент с каждым массивом (newData_array и старыйData_array). Если условие выполнено, мне нужно что-то загрузить, для этого я использую URL-адрес, и, как вы знаете, эта функция асинхронна, добавление слушателя, событие будет запущено, когда загрузка будет завершена, проблема очень ясна, так как urlloader не остановит цикл for (как я ожидал бы на PHP-подобном языке), я просто собираюсь загрузить кучу изображений, создавая в то же время катастрофу, потому что я не буду знать, когда ее сохранять. Поэтому мне нужно использовать любой слушатель, но, поскольку я не очень привык к подобным процедурам, я довольно приставал к ним.

Я не заинтересован в процедурах сохранения на диске, эта часть в значительной степени выполнена, я просто хочу понять, как я должен структурировать этот алгоритм, чтобы сделать эту работу.

ответ

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); 
} 

Это как раз у меня на голове, поэтому вам нужно будет найти имена переменных, но я надеюсь, что это имеет смысл.

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)); 
} 
Смежные вопросы