我是 Swift 的新手 - 请怜悯 - 使用我的代码,我无法从外部 Firebase 服务器中删除 .childRemoved,因为预期的是 Int 而不是 String 并且无法弄清楚如何从我的 tableview 中删除一条消息,我'正在从外部 Firebase 中删除
import UIKit
import Firebase
class FCViewController: UIViewController, UINavigationControllerDelegate {
var ref: FIRDatabaseReference!
var messages: [FIRDataSnapshot]! = []
func configureDatabase() {
ref = FIRDatabase.database().reference()
ref.child("messages").observe(.childRemoved, with: { (snapshot) in
// MY PROBLEM 1: can not remove this chat with such identifier from the external Firebase server because an Int is expected instead of an String
self.messages.remove(at: snapshot.key)
// MY PROBLEM 2: when solving PROBLEM 1, table does not reload from Firebase like this, check on the comments the link for the answer to this:
// reload table to featch data from Firebase
self.messagesTable.reloadData()
}, withCancel: nil)
}
}
快照.key
prints: -KflJWAyY3KSyyN8RA5U
self.messages 打印:
[Snap (-KflJVkAYLaoEiFPD86N) {
name = "user 1";
text = fadsfd;
timestamp = "2017-03-21 14:42:45 +0000";
},
Snap (-KflJWAyY3KSyyN8RA5U) {
name = "user 1";
text = adsfasdf;
timestamp = "2017-03-21 14:42:45 +0000";
}]
谢谢!
最佳答案
var messages: [FIRDataSnapshot]! = []
是一个快照数组,你正试图通过一个字符串删除它(snapshot.key 是一个字符串)
self.messages.remove(at: snapshot.key)
Swift 期望 at: 成为数组中的整数索引。
我建议不要这样做,因为存储在数组中的对象(对象 ID)与删除时引用的对象不同。
使用字典数组或什至例如 MessageClass 对象会更好,这些对象已填充了来自 Firebase 快照的数据,并将键作为其参数之一。
这是一些涵盖所有基础的代码
class MessageClass {
var key = ""
var name = ""
}
var messagesArray = [MessageClass]()
func readInAllMessages() {
let messagesRef = ref.child("messages")
messagesRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let snap = child as! FIRDataSnapshot
let msg = self.snapToMsgClass(child: snap)
self.messagesArray.append(msg)
}
})
}
func addRemoveObserver() {
let messagesRef = ref.child("messages")
messagesRef.observe(.childRemoved, with: { snapshot in
let keyToRemove = snapshot.key
if let i = self.messagesArray.index(where: { $0.key == keyToRemove }) {
self.messagesArray.remove(at: i)
}
})
}
func snapToMsgClass(child: FIRDataSnapshot) -> MessageClass {
let dict = child.value as! [String:Any]
let name = dict["name"] as! String
let msg = MessageClass()
msg.name = name
msg.key = child.key
return msg
}
关于ios - 由于预期为 Int 而不是 String,无法从外部 Firebase 服务器中删除 .childRemoved,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42932250/