我刚开始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对象的索引
答案 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中,可能没有唯一的密钥(我将名称用于比较)。
我真的希望看到更好的解决方案。