Firebase ios快照为.childRemoved返回null

我刚刚开始与Swift一起使用Firebase,并且有一个示例消息节点。 我添加消息持有的文本和用户名等孩子我有安全规则设置为每个.write和.readauthentication。 我创build了一个观察者来监视这个,并且它正在触发,但是它返回的快照是空的。 我需要快照数据的原因是我可以从客户端删除确切的消息。

数据节点结构:

{ "messages" : { "-KcM3SlAQXfjCz01waXF" : { "name" : "mgardner1994", "text" : "test23" }, "-KcM3UKA_U7n2YwhlFeB" : { "name" : "mgardner1994", "text" : "test4" }, "-KcMB_8Ec74HIQGL9adt" : { "name" : "mitchell_maler", "text" : "test5" }, "-KcOC08kLUO-cEWLeICG" : { "name" : "mitchell_maler", "text" : "hello" }, "-KcOC6ZWT6gyVi6pxGF8" : { "name" : "mitchell_maler", "text" : "test" } } } 

规则:

 { "rules": { "messages": { ".read": "auth != null", ".write": "auth != null" } } } 

SWIFT代码:

 _refHandleDel = ref.child("messages").observe(.childRemoved, with: { (snapshot) -> Void in // TODO: Why is snapshot returning nil let index = self.messages.index(of: snapshot) self.messages.remove(at: index!) self.messagesTable.deleteRows(at: [IndexPath(row: index! , section: 0)], with: .automatic) }) 

编辑:添加数据结构到文本而不是图像。

你可能想用另一种方式来解决它:

每个快照(或子快照)将有一个键,这就是你应该在你的数组(表,数据源等)

换句话说,当消息最初被加载时(例如进入一个dataSource),它们将在一个key:value对中

 messages -KcM3SlAQXfjCz01waXF (the key) name : "mgardner1994", (the values which are a dictionary) text : "test23" 

理想情况下,您最终将得到这些键值对的数组

 a[0] = key:value = -KcM3SlAQXfjCz01waXF: dictionary of children a[1] = key:value = -KcM3UKA_U7n2YwhlFeB: dictionary of children 

注意上面是字典,但它可能是一个UserClass或ItemsClass

 a[0] = aUser (UserClass) a[1] = aUser (UserClass) 

当你的应用程序接收到一个删除事件时,它将传递key:value对作为快照。 我们不关心价值,但我们关心的关键,你可以find该数组中的项目的索引,并将其删除。 (通过ObjC NSPredicatefind匹配)或者…像这样的Swift中,如果您使用UserClass例如

 func handleChildRemoved(_ snapshot: FDataSnapshot! ) { let key = snapshot.key if let index = self.usersArray.indexOf({$0.firebaseKey == key}) { self.usersArray.removeAtIndex(index) self.usersTableView.reloadData() } } 

在这个例子中,我有UserClass

 class UserClass { firebaseKey = "" userName = "" } 

我能够通过创build一个查找函数来解决这个问题。 我仍然不确定为什么索引()的方法不工作,但将继续挖掘。

 _refHandleDel = ref.child("messages").observe(.childRemoved) { (snapshot: FIRDataSnapshot!) in print(snapshot) // Never finds the object and returns nil let index = self.messages.index(of: snapshot) print(index ?? "no") // using the workaround method it finds the index using the key let index2 = self.indexOfSnapshotInArray(snapshot: snapshot, snapshotArray: self.messages) print(index2) if (index2 != -1) { self.messages.remove(at: index2) self.messagesTable.deleteRows(at: [IndexPath(row: index2 , section: 0)], with: .automatic) } else { print("Could not find message in array.") } } func indexOfSnapshotInArray(snapshot: FIRDataSnapshot, snapshotArray: [FIRDataSnapshot]) -> Int { var index = 0 for snap in snapshotArray { if (snapshot.key == snap.key) { return index } index += 1 } return -1 }