2017-07-25 112 views
1

我的表格视图当前更新我的表格并在添加到我的Firebase数据库时实时添加新项目。问题是我无法实时删除。我将firebase中的数据存储在本地数组中,然后将该数组加载到tableview中。如何删除在Firebase中删除后的表格项目

我试着压缩一下我的代码。我还尝试将放入我的populateArrays()函数内的removeDeletedItems()函数内的Firebase代码放在.childAdded侦听器之后,但没有实时删除数据的运气。

override func viewDidLoad() { 

     super.viewDidLoad() 
     populateArrays()   

    } 


    func removeDeletedItems() { 

     let databaseRef = FIRDatabase.database().reference() 
     databaseRef.child("Users").observe(FIRDataEventType.childRemoved, with: { (FIRDataSnapshot) in 

      guard let emailToFind = FIRDataSnapshot.value as? String else { return } 
      for (index, email) in self.usernames.enumerated() { 
       if email == emailToFind { 
        let indexPath = IndexPath(row: index, section: 0) 
        self.usernames.remove(at: index) 
        self.tableView.deleteRows(at: [indexPath], with: .fade) 
        self.tableView.reloadData() 
       } 
      } 
     }) 
    } 

func populateArrays(){ 

     let databaseRef = FIRDatabase.database().reference() 
     databaseRef.child("Users").observe(FIRDataEventType.childAdded, with: { (FIRDataSnapshot) in 

      if let data = FIRDataSnapshot.value as? NSDictionary { 
       if let name = data[Constants.NAME] as? String { 

           self.usernames.append(name) 
           self.removeDeletedItems() 
           self.tableView.reloadData() 
       } 
      } 
     }) 
    } 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

     cell.textLabel?.text = usernames[indexPath.row]   
     return cell 
    } 

回答

1

不是观察值总是一个字典吗?你不应该检查名称而不是电子邮件吗?

找到名称的循环是不需要的。有一个方便的功能。

databaseRef.child("Users").observe(FIRDataEventType.childRemoved, with: { snapshot in 

      guard let data = snapshot.value as? [String:Any], 
        let nameToFind = data[Constants.NAME] as? String else { return } 
       if let index = self.usernames.index(of: nameToFind) { 
        let indexPath = IndexPath(row: index, section: 0) 
        self.usernames.remove(at: index) 
        self.tableView.deleteRows(at: [indexPath], with: .fade) 
        // don't reload the table view after calling `deleteRows` 
       } 
      } 
     }) 
+0

我对Constants.EMAIL表示抱歉 - 我有一个单独的常量swift文件,而Constants.EMAIL只是表示“email”。我忘了改变这一点。 – user2411290

+0

我更新了答案,您还应该检查像'added'方法中的名称。 – vadian

+0

工作。我真的很感谢你的帮助! – user2411290