2017-04-03 9 views
1

に最近追加された値を取得することはできません。は、私は私のアプリに2つのView Controllerを持ってFirebase

問題は、ユーザーが2番目のビューコントローラーにアイテムを追加し、最初のコントローラーに戻って本当に速くなってしまうことです。これにより、Firebaseデータベースがアイテムを保存しないことがあります。結果として、最初のView Controllerは新しく追加された項目を表示しません。

移植が行われる限り、私はviewWillAppearに項目を取り出し、viewDidDisappearのFirebaseリスナーオブザーバを削除します。これをどうすれば解決できますか?

// first view controller code 

var items = [Item]() 

var ref: FIRDatabaseReference! 

func fetchItems() { 
    ref.child("items").observeSingleEvent(of: .value, with: { (snapshot) in 
     self.items = [] 
     for child in snapshot.children.allObjects as! [FIRDataSnapshot] { 
      if let dictionary = child.value as? [String: AnyObject] { 
       // Create item and append it to an items array 
      } 
     } 
     self.tableView.reloadData() 
    }) 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated)     
    self.fetchItems() 
} 

override func viewDidDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    ref.removeAllObservers() 
} 
+0

View Controller 2のコードを表示できますか? – dstepan

+0

Firebaseは非同期で動作するため、viewWillAppearでデータを呼び出すのではなく、viewController1のtableViewのデリゲートを使用してデータをリロードします。 –

答えて

1

firebaseデータベースが変更されるたびにコードを実行する必要があるため、observeSingleEventは使用しないでください。だから、それを変更します。

func fetchItems() { 
ref.child("items").observe(.value, with: { (snapshot) in 
    self.items = [] 
    for child in snapshot.children.allObjects as! [FIRDataSnapshot] { 
     if let dictionary = child.value as? [String: AnyObject] { 
      // Create item and append it to an items array 
     } 
    } 
    self.tableView.reloadData() 
}) 

}

これは、リスナーを作成します。また、以前はオブザーバを作成していなかったので、removeAllObservers()を使用する必要はありませんでした。今、あなたはそれを使うのが正しいです。 お手伝い願います!

+0

ありがとうございます。このコードの問題は、ユーザーが最初のビューコントローラーでセルを削除するためにスワイプすると、リスナーがトリガーされ、 'self.tableView.reloadData()'がスワイプから削除のテーブルビューに時間を与えないことですアニメーションを終了します。 – Cesare

+0

その部分のコードを見ることはできますか? editActionsForRowAt indexPathを使用していますか?どのようなアニメーションを実行する必要がありますか? –

+0

あなたのフォローアップJaimeに感謝します。私は 'tableView(_ tableView:UITableView、コミットeditingStyle:UITableViewCellEditingStyle、forRowAt indexPath:IndexPath)'メソッドで 'deleteSectionsAt'を使用しています。 – Cesare

関連する問題