从 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 检索图像作为布尔数据?

如何从firebase数据库中检索数据作为字符串而不是字典并将其添加到数组中?

firebase Firestore 文档已读取

从firebase数据库中检索计算平均值

使用 SwiftUI Xcode 11 从 firebase 实时数据库中检索数据

Firebase、Flutter - 读取、检索过滤后的数据