2017-03-21 4 views
0

私はBack4App(Parse)を使ってアプリケーションを構築しています。Back4Appからデータを取得する(Parse)

私は2つのテーブルポストとメディアを持っています。 post_idに対応するメディア(単一または複数)をフェッチする必要があります。

私は次のアプローチを使用しています: まず、Postテーブルからすべての投稿を取り出し、ArrayListに保存しました。 その後、forループを使用して、ArrayListから特定のpost_idを取り出し、そのpost_idのメディアを見つけるためにmedia queryに送ります。

しかし、私の問題は、クエリが非同期であることです。そのため、forループがクエリより先に実行され、クエリの結果が後で取得されるためです。 forループは、ArrayListのサイズまでクエリより先に実行されています。どうすればこの問題を解決できますか?すべてのヘルプを深く理解されるであろう

for (int i = 0; i < listUserPosts.size(); i++) { 
String postId = listUserPosts.get(i).getPostId(); 
ParseQuery<ParseObject> query = ParseQuery.getQuery("Media"); 
query.whereEqualTo("post_id", postId); 
query.findInBackground(new FindCallback<ParseObject>() { 
          @Override 
          public void done(List<ParseObject> objects, ParseException e) { 
         if (objects.size() > 0) { 
         for (int j = 0; j < objects.size(); j++) 
         { 
         ParseObject parseObject = objects.get(j); 
         //fetching data from parseObject 
         } 
         } 
         } 
         }); 

私は、次のアプローチを使用しています。

答えて

0

正確に何をする必要があるのか​​分かりませんでしたが、すべてのメディアを取り込んだ時点を知ることが課題です。だからこのようなものが必要でしょう:

for (int i = 0; i < listUserPosts.size(); i++) { 
    String postId = listUserPosts.get(i).getPostId(); 
    ParseQuery<ParseObject> query = ParseQuery.getQuery("Media"); 
    query.whereEqualTo("post_id", postId); 
    query.findInBackground(new FindCallback<ParseObject>() { 
     private int currentI = i; 

     @Override 
     public void done(List<ParseObject> objects, ParseException e) { 
      if (objects.size() > 0) { 
       for (int j = 0; j < objects.size(); j++) 
       { 
        ParseObject parseObject = objects.get(j); 
        //fetching data from parseObject 
       } 
      } 
      if (currentI + 1 == listUserPosts.size()) { 
       // It is finished. Do whatever you have to do here. 
      } 
     } 
    }); 
関連する問題