【问题标题】:How do you call a firebase snapshot in Objective C instead of swift?你如何在Objective C中调用firebase快照而不是swift?
【发布时间】:2021-02-25 13:43:52
【问题描述】:
JSON
switch
  uid
    switch : true
  uid2
    switch : false

更新:以上是我在杰伊的评论后添加的数据库结构。

我会很快做到:

    let databaseRef = Database.database().reference().child("switch").child(self.postID)
databaseRef.queryOrdered(byChild: "switch").queryEqual(toValue: "true").observeSingleEvent(of: .value) { (snapshot) in               
 print(snapshot)
            if snapshot.exists() {
                print("Address is in DB")
              } else {
                print("Address doesn't exist")
              }
                }

但我必须使用 Objective C,因为我必须使用 Objective C 选择器

   @objc func didLongPress() {

 ///that snapshot
 }

    override func awakeFromNib() {
     super.awakeFromNib()
        let longPress = UILongPressGestureRecognizer(target: self, action: #selector(didLongPress))
            like.addGestureRecognizer(longPress)
    }

更新:可能的解决方案?

       let ref = Database.database().reference().child("switch").child(self.postID).child("switch")
    ref.observeSingleEvent(of:.value,  with: {snapshot in
         if snapshot.exists() {
            print("Got data \(snapshot.value!)") //will print true or false
            let ab = snapshot.value!
            if ab as! Int>0 {
                print("yes")
            } else {
                print("no")
            }
        }
        else {
            print("No data available")
        }
    })

【问题讨论】:

  • Firebase 文档也展示了 Objective C 代码示例:firebase.google.com/docs/database/ios/…
  • 谢谢。我会尽力。但是在哪里添加 @property (strong, nonatomic) FIRDatabaseReference *ref; 以获取 swift 等效的 var ref: DatabaseReference!
  • 不要将 Objc 选择器与与 firebase 交互的实际代码混淆。您当然可以将 Swift 与 @objc 一起使用。当您将 @objc 应用于 Swift 项目中的类或方法时,它将使它们可用于 Objective-C 以及 Swift 代码。问题似乎与您的查询有关;它针对子节点 switch 运行,然后在看起来不正确的子节点 switch 上进行查询。
  • 此外,在发布 Firebase 问题时,包括您的结构也很重要,因此我们可以看到您正在尝试做什么。所以,用你的结构更新你的问题,请作为文本,没有图像。要获取您的 Firebase 结构,请使用 Firebase 控制台->导出 JSON,然后复制并粘贴您的结构的 sn-p。
  • @Jay 谢谢。这很奇怪。所以我应该能够在目标 c 函数中使用 swift 代码。我添加了数据库结构。我不认为问题出在同名的孩子身上。我还使用名为 switch1 的第二个 switch 子项进行了测试

标签: objective-c swift firebase firebase-realtime-database snapshot


【解决方案1】:

问题在于查询。这是问题的结构

JSON
switch
  uid
    switch : true
  uid2
    switch : false

并且正在使用的查询正在查询以下内容

your_database
   switch
      uid
         switch: true --> the query is running against this single child node <--
      uid2
         the query is NOT running here

如果您知道路径,则确实没有理由对单个子节点运行查询。如果目的是确定该孩子是否存在,则根本不需要查询。直接读取节点,看看是否存在

let ref = your_database.child("switch").child(self.postID).child("switch")
ref.observeSingleEvent...

如果 switch 存在任何值(真或假),它将在快照中返回。

编辑

如果您想知道孩子的价值,如果它存在,它将在快照中。这是一些代码

let ref = your_database.child("switch").child(self.postID).child("switch")
ref.getData { (error, snapshot) in
    if let error = error {
        print("Error getting data \(error)")
    }
    else if snapshot.exists() {
        let myBool = snapshot.value as? Bool ?? false
        print("Got data \(myBool)") //will print true or false
    }
    else {
        print("No data available")
    }
}

【讨论】:

  • 谢谢。但我需要知道它是真是假。如果它是真的,我会展示一些东西,如果它是假的,我会展示一些别的东西。我昨天用if snapshot.isEqual(true) 尝试了let ref = your_database.child("switch").child(self.postID).child("switch") 的格式,但它不起作用
  • @uuuuuu 如果存在,该值将在快照中(如我的回答中所述);对或错。此if snapshot.isEqual(true) 无效且无法使用。查看文档Read Data Once 可能是个好主意,这样您就可以阅读 firebase 子值。我在答案中添加了一个编辑作为解决方案。
  • 谢谢。这就说得通了。打印真假是一个好的开始。我只需要根据它是真还是假来执行不同的代码。在 else if 中,我可以使用类似:if snapshot.value! == true...
  • 也是 getData 不是存储调用。错误提示 Value of type 'DatabaseReference' has no member 'getData'
  • 我确实重新集成了 pod,然后安装了 pod。我清除了构建文件夹,删除了派生数据等。仍然报错Value of type 'DatabaseReference' has no member 'getData'这真的很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2016-05-27
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多