2016-05-18 6 views
0

私は食料雑貨品リストアプリケーションで作業していました。 Firebaseを使用してテーブルビューにデータを同期しようとしたとき、テーブルビューに食料品を表示することはできません。ただし、シミュレータをリセットすると、以前に追加されたアイテムはテーブルビューに表示されますが、別のアイテムを追加するとテーブルビューに表示されません。私はコードをダブルチェックし、何も間違っていないことを発見した。あなたは私がそれを修正する助けてもらえますか?(例えば、以下の二つの画像では、コーヒーの項目は表示されません)Swift:Firebaseを使用してテーブルビューにデータを同期できません

コードの一部GroceryListViewController.swift

override func viewDidAppear(animated: Bool) { 
super.viewDidAppear(animated) 
//Attach a listener to receive updates. 
ref.observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

    var newItems = [GroceryItem]() 

    for item in snapshot.children 
    { 
     let groceryItem = GroceryItem(snapshot: item as! FDataSnapshot) 
     newItems.append(groceryItem) 
    } 
    self.items = newItems 
    self.tableView.reloadData() 
    }) 
} 

Simulator Image Firebase Image

答えて

1

1 - observeSingleEventOfTypeを使用しています(*これはobserveEventType:withBlock:と等価ですが、最初のデータが返された後すぐにブロックがキャンセルされる点が異なります)。あなたのリスナーは一度呼び出され、リスニングを止めます。 observeEventType利用代わり

2 - あなたはこのようなメインスレッド上で、あなたのテーブルビューのreloadDataを行う必要があります。その理由は、あなたが/バックグラウンドスレッドからUIと相互作用してはならないことはできないということです

NSOperationQueue.mainQueue().addOperationWithBlock({ 
     self.tableView.reloadData() 
}) 

。 Firebaseが非同期であるので、完了ブロックは、バックグラウンドスレッドである

+0

私はこのコードを追加しましたが、うまくいきませんでした。 tableViewは同じままです。 – Magenta

+0

これで、observeSingleEventOfTypeを使用していることがわかりました。 observeEventTypeを使用してみてください(FEventType.ChildChanged、.... – abarbier

0

は一度ボタン「+」をタッチするこのコードを追加します。

self.items.append(groceryItem) 
    let row = self.items.count - 1 
    let indexPath = NSIndexPath(forRow: row, inSection: 0) 
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade) 

を。これは、UIとの相互作用を確実にします。

1

多分それは明らかですが、それは私に起こります。私はデバッグしていて、コードはブレークポイントで停止され、データはFirebaseのコンソールにはありませんでした。それから私はそれが完全にリフレッシュするようにしなければならないことに気づいた。たぶんそれは助けることができます...

関連する問題