【问题标题】:What does the snapshot/observer code do in firebase?快照/观察者代码在 Firebase 中做了什么?
【发布时间】:2023-03-23 12:54:01
【问题描述】:

从 Firebase 检索数据时,我们通常使用以下代码(或对其进行一些重复)

...observeSingleEvent(of: .value, with: { snapshot in

var tempPosts = [PostModel]()

for child in snapshot.chidren{
}

return tempPosts

})

但我不完全明白这段代码在做什么?有人可以解释一下吗?我尝试在多个位置打印数据,但我得到的唯一数据是:Snap post 或 [App.PostModel]

【问题讨论】:

    标签: swift firebase


    【解决方案1】:

    此代码用于观察数据库中的数据变化。您无需不时发送请求以获取最新数据。

    当数据发生变化时,它会触发你给出的闭包,以便你可以做一些事情。如需更多参考,您可以阅读this doc

    您可以尝试将快照隐藏到字典中:

    for child in snapshot.children {
        let dataS = child as! DataSnapshot
        let dict = dataS.value as? [String : AnyObject]
        // handle the data
    }
    
    

    【讨论】:

    • 这是一个很好的尝试,但不幸的是不正确。您可能忽略了问题中的.observeSingleEvent 而不是.observe。问题中的代码没有观察到数据变化;它立即获取数据并返回该数据一次且仅一次,并且不会观察该数据的任何更改,也不会在数据更改时触发任何事件。答案中的代码将起作用,但前提是快照的值是另一个快照/字典。如果它是 String 或 Int 等原语,它将崩溃。
    • 哦!感谢您指出我的错误。正如document 提到的,你是对的。使用.observeSingleEvent 只会加载一次数据。对此感到抱歉。请参考@jay 的答案而不是我的答案。
    【解决方案2】:

    您问题中的代码使用 .observeSingleEvent。这意味着它会立即从 Firebase 请求数据,并且不会观察到任何未来的变化或触发任何其他事件。

    数据在闭包中作为“快照”返回,并且是该数据在某个时间点的样子的“图片”。 (快照...图片?很活泼吧)

    Firebase 数据仅在闭包内有效;闭包之后的任何代码都将在 Firebase 有时间从服务器检索数据之前执行,因此请确保您使用该闭包内部的 Firebase 数据。

    for 循环一次遍历快照中的子节点。例如,快照可以包含 /users 节点中每个用户的子快照。然后,您可以从每个子快照中获取用户数据。

    return 语句不应该在异步闭包中使用,因为你不能从闭包中返回数据(以这种方式),因此应该删除该行。但是,您可以利用这样的完成处理程序

    func getUser(with userID: String, completion: @escaping ((_ user: UserClass) -> Void)) {
    
      //get the user info from the snapshot, create a user object and pass it back
      //   via the completion
      completion(user)
    }
    

    处理闭包外的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2013-01-02
      • 2018-09-16
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      相关资源
      最近更新 更多