从 Firebase 检索和读取数据作为 NSArray (Swift 3)
Posted
技术标签:
【中文标题】从 Firebase 检索和读取数据作为 NSArray (Swift 3)【英文标题】:Retrieving and Reading Data as NSArray from Firebase (Swift 3) 【发布时间】:2016-11-08 01:51:37 【问题描述】:我正在学习有关 Udemy 的课程,以使用 Firebase、Backendless 和 Swift 构建聊天应用程序。所有的问题(它是为 Swift 2 而不是 3 编写的)我已经能够自己解决,但是这个问题让我很难过。这个函数应该从 Firebase 数据库中检索数据,显然它应该将其作为 NSArray 检索,但现在它作为 NSDictionary 检索它,这在其他函数中产生了大量错误,因为它不期望字典。
func loadRecents()
firebase.childByAppendingPath("Recent").queryOrderedByChild("userId").queryEqualToValue(currentUser.objectId).observeEventType(.Value, withBlock:
snapshot in
self.recents.removeAll()
if snapshot.exists()
let sorted = (snapshot.value.allValues as NSArray).sortedArrayUsingDescriptors([NSSortDescriptior(key: "date", ascending: false)])
)
我已经更新到 Swift 3:
func loadRecents()
ref = FIRDatabase.database().reference()
let userId = currentUser?.getProperty("username") as! String
ref.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: userId).observe(.value, with:
snapshot in
self.recents.removeAll()
if snapshot.exists()
let values = snapshot.value as! NSDictionary
)
当然,使用as! NSArray
是行不通的。如果有人能建议一种方法来更新它以使用 Swift 3,按数据中的值对其进行排序,并且以后能够访问它,将非常感激。谢谢!
【问题讨论】:
【参考方案1】:func loadRecents()
ref = FIRDatabase.database().reference()
let userId = currentUser?.getProperty("username") as! String
ref.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: userId).observe(.value, with:
snapshot in
self.recents.removeAll()
if snapshot.exists()
let values = snapshot.value as! [String:AnyObject]
)
或者你也可以使用let values = snapshot.value as! [Any]
【讨论】:
谢谢,这有帮助,但我从做更多的研究中看到,我应该使用for child in snapshot.children let myvalue = child.value["my value"] as! String
或类似的东西来梳理子节点。但是,当我这样做时,它说“NSFastEnumerationIterator 没有元素值”,然后它建议我将它转换为 AnyObject,但这当然也不起作用。你知道怎么做吗?
@EthanT 首先你必须在调试模式下检查“child”返回类型【参考方案2】:
希望这对你有帮助,试试这个代码:
func loadRecents()
let ref = FIRDatabase.database().reference()
let userId = currentUser?.getProperty("username") as! String
ref.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: userId).observe(.value, with:
snapshot in
self.recents.removeAll()
guard let mySnapshot = snapshot.children.allObjects as? [FIRDataSnapshot] else return
for snap in mySnapshot
if let userDictionary = snap.value as? [String: Any]
print("This is userKey \(snap.key)")
print("This is userDictionary \(userDictionary)")
)
【讨论】:
以上是关于从 Firebase 检索和读取数据作为 NSArray (Swift 3)的主要内容,如果未能解决你的问题,请参考以下文章
如何从firebase数据库中检索数据作为字符串而不是字典并将其添加到数组中?