2017-04-03 176 views
1

最近增加值我在我的应用的两个视图控制器:第一个显示项目从火力地堡数据库中抽取,而第二个让用户添加和删除数据库中的项目无法检索与火力地堡

问题是当用户在第二个视图控制器中添加一个项目并且非常快地返回到第一个控制器时。这有时会导致Firebase数据库不保存该项目。因此,第一个视图控制器将不会显示新添加的项目。

就植入而言,我获取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中使用viewController2中的委托来重新加载数据。 –

回答

1

您不应该使用observeSingleEvent,因为您希望每次firebase数据库更改时都要执行代码。所以,改变它:

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,commit editingStyle:UITableViewCellEditingStyle,forRowAt indexPath:IndexPath)'方法中使用'deleteSectionsAt'方法。 – Cesare