在 Swift 中从 Firebase 读取现有数据一次

Posted

技术标签:

【中文标题】在 Swift 中从 Firebase 读取现有数据一次【英文标题】:Read Existing data once from Firebase in Swift 【发布时间】:2020-03-13 16:30:18 【问题描述】:

我想从 firebase 读取现有数据一次,我不想听 firebase 中的进一步变化。我使用了下面的代码,但没有执行 if 和 else 语句。我也尝试使用observe api而不是observeSingleEvent,但它不起作用。

func readData(empid : Int)
        
            var data  =  ["name":"","address":"","age":0] as [String : Any]
            let ref: DatabaseReference! =  Database.database().reference()

            ref.child("Org").child("emp") .child(String(empid)).observeSingleEvent(of: .value, with:  (snapshot) in

                if(snapshot.exists())
                
                    data = snapshot.value as! Dictionary<String, Any>
                    print("data    ",data)

                
                else
                
                    print("no data")
                

            )
        

【问题讨论】:

【参考方案1】:

来自Docs:

在某些情况下,您可能希望调用一次回调然后立即删除,例如在初始化您不希望更改的 UI 元素时。可以使用observeSingleEventOfType方法来简化这个场景:事件回调添加触发一次后不再触发。

这对于只需要加载一次且预计不会频繁更改的数据很有用或需要主动收听。例如,前面示例中的博客应用程序使用此方法在用户开始创作新帖子时加载他们的个人资料

observeSingleEvent 将使用离线缓存,并且不会在数据库发生更改时立即更新。这就是为什么您没有获得最新数据的原因。我之前也遇到过这个问题,拿到数据后立马把observer去掉了。

你可以这样使用:

let observer:FIRDatabaseHandle!
observer = ref.child("Org").child("emp") .child(String(empid)).observe(DataEventType.value, with:  (snapshot) in
    removeObserverWithHandle(observer)
    //I am not sure if that's the right syntax 
    //but there is a func to remove an observer handle. See the link below
)

来自Docs:

当您离开 ViewController 时,观察者不会自动停止同步数据。 如果观察者没有被正确移除,它会继续将数据同步到本地内存。当不再需要观察者时,通过将关联的 FIRDatabaseHandle 传递给 removeObserverWithHandle 方法来移除它。

因此,如果不再需要观察者,则应始终删除它。

Also see this stack post

【讨论】:

以上是关于在 Swift 中从 Firebase 读取现有数据一次的主要内容,如果未能解决你的问题,请参考以下文章

在 TableViewCell Swift 中从 Firebase 加载图像

在 Swift 中从 Firebase 检索数据的问题

在 swift 4.0 中从 firebase 快照字典中获取值时打开一个可选的 nil

如何在 Swift 中从 Cloud FireStore Firebase 访问特定字段

在 Flutter 中从 Firebase 读取数组 [重复]

如何在 Flutter 中从 firebase 存储读取和写入文本文件?