2014-02-11 3 views
3

Я использую Parse SDK для Unity, чтобы получить некоторые файлы и сохранить их в моем каталоге ресурсов. Когда я вызываю parse.findAsync(), он создает другую задачу, и для меня невозможно вызвать WWW для загрузки URL-адреса, полученного из анализа. Мне нужно:Звоните WWW вне основной темы

  • Вызов Разбирает
  • Получить Синтаксическую информацию
  • Вызова WWW для каждого файла, который я получил от разбора
  • Ждите все завершает;
  • Вернуться к результатам поиска;

Я попытался это:

 public IEnumerator GetXXXAsync(String objectId){ 
     var query = ParseObject.GetQuery("xxx").WhereEqualTo("yyy", ParseObject. 
     CreateWithoutData("zzz", objectId)); 

     List<String> urlList = new List<String>(); 
     Album album = null; 

     query.FindAsync().ContinueWith(t => 
             { 
      var tasks = new List<Task>(); 
      Task task = Task.FromResult(0); 
      foreach (var result in t.Result) 
      { 
       ParseObject obj = result;  

       ParseFile file = (ParseFile)obj.Get<ParseFile>("image"); 
       if(file != null){ 
        urlList.Add(file.Url.ToString()); 
        tasks.Add(GetImageAsync(file.Url.ToString(), "image.png")); 
       }    


      } 

      // finished. 
      return Task.WhenAll(tasks); 
     }).Unwrap().ContinueWith(_ => 
     { 
      gameManager.SendOk(); 

     }); 

     return null; 
     } 

     private WWW WaitForImage(String url, string filename) { 

     WWW www = new WWW(url); 
     while(!www.isDone){ 
      Debug.Log("Waiting"); 
     } 
     Utils.SaveFileFromTexture(www.texture, (gameManager.GetResourcesPath() + "/Textures/" + filename)); 
     Debug.Log("Saving file "); 
     return www;  


    } 


    public Task<WWW> GetImageAsync(String url, string filename) { 
     var task = new TaskCompletionSource<WWW>(); 
     Debug.Log("GetImageAsync " + filename); 
     task.SetResult(WaitForImage(url, filename)); 
     return task.Task; 
    } 

Я пытался получить IEnumerator вместо WWW, но я всегда получаю WWW «не может быть вызван вне основного потока». Есть ли что-нибудь, что я могу сделать, чтобы вызвать WWW вне основного потока? Или что-нибудь еще?

Tks,

+2

Ни в коем случае вокруг него. Либо используйте «coroutine» для запуска «WWW» асинхронно »(как асинхронно, как Unity), либо найдите сторонний инструмент загрузки. – Jerdak

+0

Быстрый вопрос. Как вы планируете использовать загруженные ресурсы, если они не являются частью файлов ресурсов скомпилированных приложений? – Alex

+0

@Alex вы можете загружать изображения во время работы, используя www.LoadImageIntoTexture (texTmp); и это может использоваться для URL-адреса или пути к файлу. или для моделей вы могли бы сделать импортера, подобного этому для среды выполнения. http://wiki.unity3d.com/index.php?title=ObjImporter – Shredder2500

ответ

1

Вы можете использовать this для запуска WWW в главном потоке после того, как ваш асинхронной материал делается. Или вы можете использовать webclient в system.net для загрузки на фоновом потоке. Не забывайте, что вы можете получить загрузку с WWW в основном потоке, чтобы он не блокировал ваши фреймы во время загрузки.

пример WebClient

WebClient webClient = new WebClient(); 

webClient.DownloadProgressChanged += OnChange; 
webClient.DownloadFileCompleted += OnCompleted; 
webClient.DownloadFileAsync(new Uri(download), fileAndPath); 
Смежные вопросы