在Firebase DataSnapshot数组中查找自定义对象的索引

时间:2018-02-22 12:25:06

标签: ios swift firebase firebase-realtime-database

我刚开始Firebase

以下是JSON上的Firebase

{
  "messages" : {
    "-K2ib4H77rj0LYewF7dP" : {
      "name" : "anonymous",
      "text" : "Hello"
    },
    "-K2ib62mjHh34CAUbide" : {
      "name" : "anonymous",
      "text" : "I am fine"
    },
    "Test" : {
      "name" : "test111",
      "text" : "text22"
    }
  }
}  

在Swift中,我观察在服务器上添加/删除项目时,它应该反映在应用程序中。添加记录工作正常。但是对于删除,我不知道如何根据索引从数组中删除该项。使用indexOf返回一个地址(我猜数组不会在没有映射的情况下删除对象)。

这是我尝试过的错误代码,但不起作用:

_refHandle = self.ref.child("messages").observe(.childRemoved, with: { [weak self] (snapshot) -> Void in
        guard let strongSelf = self else { return } 

        let values = snapshot.value as? NSDictionary
        let indexToBeRemoved = strongSelf.messages.index(where: {
            let valuesFilter = $0.value as? NSDictionary
            valuesFilter!["name"] as! NSString === values!["name"] as! NSString
            return true
        })
        print(indexToBeRemoved)
        strongSelf.messages.remove(at: indexToBeRemoved!)  
        strongSelf.clientTable.deleteRows(at: [IndexPath(row: indexToBeRemoved!, section: 0)], with: .automatic)    
    })  

indexToBeRemoved出现为0.

我还尝试使用this回答删除对象,但它返回了一个地址。

预期结果:

获取要删除的DataSnapshot对象的索引

1 个答案:

答案 0 :(得分:1)

所以这对我有用:

_refHandle = self.ref.child("messages").observe(.childRemoved, with: { [weak self] (snapshot) -> Void in
        guard let strongSelf = self else { return }

        let values = snapshot.value as? NSDictionary
        let indexToBeRemoved = strongSelf.messages.index(where: {
            let valuesFilter = $0.value as? NSDictionary
            return valuesFilter!["name"] as! NSString === values!["name"] as! NSString
        })

        print(indexToBeRemoved)
        strongSelf.messages.remove(at: indexToBeRemoved!)
        strongSelf.clientTable.deleteRows(at: [IndexPath(row: indexToBeRemoved!, section: 0)], with: .automatic)
    })  

我将比较结果返回给索引。

但我相信这不是实现这一目标的最佳方式。因为,在JSON中,可能没有唯一的密钥(我将名称用于比较)。
我真的希望看到更好的解决方案。