ios - Firebase ios 快照为 .childRemoved 返回 null

标签 ios swift firebase firebase-realtime-database

我刚刚开始使用 Firebase 与 Swift 合作,并有一个示例消息节点。我添加了包含文本和用户名等的消息子项。我设置了安全规则,以便对每个 .write 和 .read 进行身份验证。我创建了一个观察者来观察这一点,它正在触发,但它返回的快照为空。我需要快照数据的原因是这样我可以从客户端删除该确切消息。

数据节点结构:

{
"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)
})

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

最佳答案

您可能想用另一种方式来解决这个问题:

每个快照(或子快照)都有一个键,这就是您应该在数组(表、数据源等)中查找的键

换句话说,当消息最初加载时(例如加载到数据源中),它们将位于键:值对中

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)

当您的应用程序收到删除事件时,它将传递键:值对作为快照。我们不关心值,但我们关心键,因为您可以在数组中找到该项目的索引并将其删除。 (通过 ObjC NSPredicate 来查找匹配项)或者...如果您使用的是 UserClass,则在 Swift 中类似这样

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 = ""
}

关于ios - Firebase ios 快照为 .childRemoved 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42100525/

相关文章:

ios - UIImagePicker 给出运行时错误

ios - 与 NSMutableArray 相比,我可以修改 NSArray 中的数据吗?

ios - 可扩展 UITableViewCell 内的 UIButton 不会消失

swift - 过滤 Realm 对象以按属性仅获取一个(不同的)对象

angular - 如何将两个 firebase 集合组合成一个新的对象数组

ios - 在 iOS 上以编程方式向按钮添加操作

ios - 在 iOS 上使用带有多个 VBO 和 IBO(多个对象)的 VAO 进行绘制 OpenGLES 2

ios - 旋转后键盘延伸高度不正确

android - 无法从 firebase 控制台发送通知

android - 如何将 firebase in-app-messaging-display api 的源代码导入到我的 android 项目中?