【问题标题】:Swift child is returning Null when nested or ObserveSingleEvent, returns fine when not nested嵌套或 ObserveSingleEvent 时,Swift 子级返回 Null,未嵌套时返回正常
【发布时间】:2019-06-25 03:35:35
【问题描述】:

我正在尝试检索一个孩子的孩子。整个 snapshotValue 返回 null。当我检索与孩子相同的数据(未嵌套)时,它检索得很好。

我正在使用 XCode 10 和 Swift 4

出于故障排除的目的,我有两个名为“Promoters”的节点。一个位于根目录,一个嵌套在“Partners”子级中(首选)。当嵌套节点工作时,我将删除顶级节点。

这是数据结构:

"Partners" : {
    "Acts" : [hidden],
    "Promoters" : [ null, {
      "Cell" : hidden,
      "Contact Name" : “hidden”,
      "Email" : “hidden”,
      "Facebook" : “hidden“,
      "Title" : "CHORD Productions"
    } ]
  },
"Promoters" : {
    "chord" : {
      "Title" : "Chord Productions"
    }
  }

这会检索我正在寻找的数据(用于填充选择器的标题列表):

        let promotersDB = Database.database().reference().child("Promoters")
        promotersDB.observe(.childAdded) { (snapshot) in

            let snapshotValue = snapshot.value as! Dictionary<String, String>
            let promoterName = snapshotValue["Title"]!
            let promoter = PromoterClass()
            promoter.promoterName = promoterName
            self.promoterArray.append(promoter)
            let isSuccess = true
            completion(isSuccess)
        }

这将返回 nil:

        let promotersDB = Database.database().reference().child("Partners").child("Promoters")
        promotersDB.observe(.childAdded) { (snapshot) in

            let snapshotValue = snapshot.value as! Dictionary<String, String>
            let promoterName = snapshotValue["Title"]!
            let promoter = PromoterClass()
            promoter.promoterName = promoterName
            self.promoterArray.append(promoter)
            let isSuccess = true
            completion(isSuccess)
        }

我更喜欢observeSingleEvent,但这也返回nil:

        let promotersDB = Database.database().reference().child("Promoters")
        promotersDB.observeSingleEvent(of: .value, with: { (snapshot) in

            let snapshotValue = snapshot.value as! Dictionary<String, String>
            let promoterName = snapshotValue["Title"]!
            let promoter = PromoterClass()
            promoter.promoterName = promoterName
            self.promoterArray.append(promoter)
            let isSuccess = true
            completion(isSuccess)
        })

错误是:

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

**我现在正在使用强制解包,以便在调查了后端规则可以完成多少数据完整性后,稍后进行审查:)

任何帮助将不胜感激。

【问题讨论】:

  • 它看起来像快照有第一条记录,但将它分配给 snapshotValue 是失败的.....po 会产生这个。 :3:1: 错误:使用未解析的标识符“snapshotValue”snapshotValue

标签: swift firebase firebase-realtime-database swift4 data-retrieval


【解决方案1】:

我认为 firebase 在处理数据树时通常会建议使用 Fan Out 方法,因此无论如何您都不应该嵌套像“Promoters”这样的数组。

您还需要通过 uid 而不是他们的姓名来识别每个促销员(以防您必须在系统中更改他们的姓名)。

因此,如果您愿意,请尝试像这样重构您的数据:

let uid = Database.database().reference().child("Promoters").childByAutoId()
// uid will be some super long string of random letters and numbers, for example like: 1hjK2SCRV2fhCI0Vv3plGMct3mL2

"Promoters" : {
    "1hjK2SCRV2fhCI0Vv3plGMct3mL2" : {
      "Title" : "Chord Productions"
    }
  }

然后当您想查询该发起人分支中的值时:

let titleRef = Database.database().reference().child("Promoters").child(uid)

titleRef.observeSingleEvent(of: .value) { (snapshot) in
    if let dict = snapshot.value as? [String: AnyObject] {
        let promoter = PromoterClass()
        promoterName = dict["Title"] as? String
        promoter.promoterName = promoterName
    }
}

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 2021-06-25
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多