2016-10-11 7 views
0

このtutorialでは、Firebaseコードがコントローラの外部に散在しています。これにより、reload()コードが既存の.observe()にあるため、Firebaseが返ってくるときにテーブルビューを簡単に読み込むことができます。Firebaseタスクの完了を聞くには?

ref.queryOrdered(byChild: "completed").observe(.value, with: { snapshot in 
    var newItems: [GroceryItem] = [] 

    for item in snapshot.children { 
    let groceryItem = GroceryItem(snapshot: item as! FIRDataSnapshot) 
    newItems.append(groceryItem) 
    } 

    self.items = newItems 
    self.tableView.reloadData() 
}) 

Firebaseコードがクラス内にある場合、どのように処理できますか?再ロードするにはまだテーブルビューが必要ですが、Firebaseが復帰した後でなければなりません。

f.performCompletedQuery() 
self.tableView.reloadData() 

f.performCompletedQuery()が実行されますが、データはまだFirebaseから取得している間にコードパスが続行されます:それはこのようになります。 self.tableView.reloadData()が起動し、テーブルが空になります(Firebaseがまだ返されていないため)。

私はFirebaseの観測を複製する必要があると思いますが、それをクラスに公開し、既存の観測を取り戻すことはできますか?少し畳み込まれているようだ。より良い方法がありますか?たぶん、ブロックして表示し、アニメーションしていますか?

+0

performCompletedQuery()にcompletionBlockを追加すると考えられますか? – Dravidian

答えて

4

完了ハンドラを使用してこれを実現します。 例:

func queryOrdered(completion: (_ result: [Any]) ->()) { 
    // request here 
    // getting response check on error 
    // set completion for returned itmes if success 
    completion([1, 2, 3]) 
} 

// call the function 
queryOrdered { [unowned self] (arr) in 

    // get returned items 
    self.myitems = arr 
    // reload the table on main queue 
    DispatchQueue.main.async { 
     self.tableView.reloadData() 
    } 
} 
+0

あなたはもう。observe()を使用していませんか? '[無所属の]'とは何ですか? – 4thSpace

+0

これで動作しました。唯一のことは、完成ブロックのためのparamは必要ありませんが、それを削除する方法はわかりません。あなたはそれについていくつか考えていますか? 4thSpace @ – 4thSpace

+0

は、単にこのような、PARAMとしてボイド関数を置く: queryOrdered FUNC(完了を:() - >()){ 完了() } 、[所有されていない自己】保持サイクル自己ための省略のために使用されます。 –

関連する問題