2016-10-20 16 views
-1

Firebaseを使用しているアプリケーションで作業しています。私が達成しようとしているのは、Firebaseからデータを取得し、そのデータをソートし、最後にそのデータをtableViewにロードすることです。データの取得、データのソート、テーブルビューへのロード(Swift 3:Firebase)

私は私の全体のコードつもりシェアないんだけど、ここで私はそれが仕事をしたいか、本質的です:

var posts = [PostStruct]() 
var following = [String]() 

...

let databaseRef = FIRDatabase.database().reference() 
for follower in following { 
    databaseRef.child("Posts").child(follower).observe(.value, with: { 
     DataSnapshot in 
      //Parse All The Data... 

      self.posts.insert(...) 

     } 
} 
self.posts.sort{$0.date.compare($1.date) == .orderedDescending} 

print("Test") 

self.tableView.reloadData() 

print("Test")呼び出されますが、それが呼び出されますFIRDatabaseが要求される前に、並べ替え時にtableViewには全くデータがないことがわかります。ですから、データベースのリクエストが完了したら、ソートする方法を見つける必要があります。

for文にsortとreloadメソッドを置くことができますが、それはうまく動作しますが、すべてが不安定になり、効率的ではありません。

答えて

2

これを処理する最良の方法であるかどうかは不明ですが、インクリメントされたカウンタを追加して、そのカウンタが次の配列のカウントと等しくなったらソートと再ロードを実行できます。

var counter = 0 

let databaseRef = FIRDatabase.database().reference() 
for follower in following { 
    databaseRef.child("Posts").child(follower).observe(.value, with: { 
     DataSnapshot in 
     //Parse All The Data... 

     counter += 1 

     self.posts.insert(...) 

     if counter == following.count { 
      self.sortPosts() 
     } 
    } 
} 

func sortPosts() { 
    self.posts.sort{$0.date.compare($1.date) == .orderedDescending} 

    print("Test") 

    self.tableView.reloadData() 
} 
+0

ありがとう!私は実際にその考えを念頭に置いていましたが、ちょうどそれを適切に考えていませんでした。助けてくれてありがとう!あなたは命の恩人です。 :) –

+0

大歓迎です。私はそれらの瞬間も持っていました。喜んで助けてください。私は@Pentarexの提案もコールバック関数について好きです。長期的には、このソリューションはもう少しエレガントに見えると思います。 – Donny

+0

ええ、私もそれを念頭に置いておきます。 :) –

1

これは私が

にお答えしようとするあなたのユーチューブのチュートリアルのためであれば、私はドニーのソリューションが動作するようになると思い、あなたはコールバック関数

func getData(handle:@escaping ((Bool) -> Void)){ 
    let databaseRef = FIRDatabase.database().reference() 
    for follower in following { 
    databaseRef.child("Posts").child(follower).observe(.value, with: { 
     DataSnapshot in 
    //Parse All The Data... 

     counter += 1 

     self.posts.insert(...) 

     if counter == following.count { 
     handle(true) 
     } 
    } 
    } 
} 
でも、それを行うことができます

を呼び出して、getDataを呼び出すメソッド内で呼び出します。

getData(){ ready in 
    self.posts.sort{$0.date.compare($1.date) == .orderedDescending} 

    print("Test") 

    self.tableView.reloadData() 
} 
+0

母、私に気づいてくれてありがとう。これは、実際には個人的なプロジェクトとYouTubeの両方のためです。 :) –

+0

コールバック関数の提案をありがとう、私は心に留めておきます。ドニーは私のためにそれを解決しました。 :) –

関連する問題