Swift 3:FirebaseDB在孩子出现时返回nil

时间:2017-08-20 03:20:31

标签: firebase swift3 firebase-realtime-database

我已将Firebase与我的应用相关联。当我尝试从数据库中读取数据时,数据存在于快照中。但是当孩子被阅读时,它会返回nil。

以下是代码:

    func checkForDuplicateScan(qrCode: String) {

    DataService.ds.REF_SAMPLES.observeSingleEvent(of: .value, with: { (snapshot) in

        if let dict = snapshot.value as? [String:Any] {
            print(dict)
            print(qrCode)
            print(dict["\(qrCode)"])
            if let sampleDict = dict[qrCode] as? [String:Any] {
                print(sampleDict)
                if let isScanned = sampleDict["scanned"] as? Bool {
                    if isScanned == true {
                        print("Already Scanned")
                        let alert = UIAlertController(title: "Already Redeemed", message: "This offer has already been redeemed by you. Stay tuned.", preferredStyle: UIAlertControllerStyle.alert)
                        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: { (alert) in
                            self.tabBarController?.selectedIndex = 0
                        }))
                        self.present(alert, animated: true, completion: nil)
                    } else {
                        print("New Scan")
                        self.updateQRCode(qrCode: qrCode)
                    }
                } else {
                    print("Error: can't read/find 'scanned' ")
                }
            }else {
                print("Error: Invalid Code Scanned")
                let alert = UIAlertController(title: "Invalid QR Code Scanned", message: "The code that you've scanned is Invalid.", preferredStyle: UIAlertControllerStyle.alert)
                alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (alert) in
                    self.tabBarController?.selectedIndex = 0
                }))
                self.present(alert, animated: true, completion: nil)
            }
        } else {
            print("Error: can't get dictionary from snapshot value")
        }
    })
}

这是控制台日志:

Console log

日志:

  1. 字典来自印刷字典 打印(字典)

  2. 'test13'来自于 打印(QRCODE)

  3. 'nil'来自于 打印(字典[ “\(QRCODE)”])

  4. 此代码截至昨天仍在使用,但今天失败了。

    帮助我!!

    编辑:这是我正在尝试阅读的数据。

    enter image description here

    这里也是JSON文件JSON FILE

    更新:看起来我在这里发现了问题。

    当我运行此代码时,不会打印任何内容。

    if let newDict = dict[qrCode] as? NSDictionary {
         print(newDict)
    }
    

    但是,当我这样做时,dict是可以访问的。

    if let newDict = dict["test10"] as? NSDictionary {
         print(newDict)
    }
    

    请注意 qrCode 是一个值为“ test10 ”的字符串

    Wierd asf !!仍然无法弄清楚背后的原因以及如何纠正这一点。

2 个答案:

答案 0 :(得分:1)

只需检查一下,您的问题似乎与数据类型有关,而与Firebase数据无关。因此,您将收到"错误:扫描的代码无效"。 我总是喜欢这样的事情:

if let value = snapshot.value as? NSDictionary {
    let username = value?["username"] as? String ?? ""
    etc ...
}

[String:Any]过去给我带来了麻烦。无论如何,提供您尝试阅读的数据样本会很有帮助。

答案 1 :(得分:0)

虽然代码应该打印,但无论如何它看起来都是糟糕的方法。您正在将所有QR码从数据库下载到客户端,然后检查其中是否存在其中一个。数据库中的数据越多,您为每次检查下载的数据就越多。将观察者附加到数据库中较低的一级是非常有效的:

func checkForDuplicateScan(qrCode: String) {
  DataService.ds.REF_SAMPLES.child(qrCode).observeSingleEvent(of: .value, with: { (snapshot) in
    if snapshot.exists() {
        if let sampleDict = snapshot.value as? [String:Any] {
            if let isScanned = sampleDict["scanned"] as? Bool {
                if isScanned == true {