我已将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")
}
})
}
这是控制台日志:
日志:
字典来自印刷字典 打印(字典)
'test13'来自于 打印(QRCODE)
'nil'来自于 打印(字典[ “\(QRCODE)”])
此代码截至昨天仍在使用,但今天失败了。
帮助我!!
编辑:这是我正在尝试阅读的数据。
这里也是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 !!仍然无法弄清楚背后的原因以及如何纠正这一点。
答案 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 {