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

Ios 在Swift中从Firebase读取一次现有数据,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我想从firebase读取一次现有数据,不想再听到firebase中的进一步更改。。我使用了下面的代码,但没有执行if或else语句。我还尝试使用ObserveAPI而不是observeSingleEvent,但它不起作用 func readData(empid : Int) { var data = ["name":"","address":"","age":0] as [String : Any] let ref: Data

我想从firebase读取一次现有数据,不想再听到firebase中的进一步更改。。我使用了下面的代码,但没有执行if或else语句。我还尝试使用ObserveAPI而不是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")
                }

            })
        }
func读取数据(empid:Int)
{
变量数据=[“名称”:““地址”:““年龄”:0]为[字符串:任意]
let ref:DatabaseReference!=Database.Database().reference()
ref.child(“Org”).child(“emp”).child(字符串(empid)).observeSingleEvent(的值:),其中:{(快照)位于
if(snapshot.exists())
{
data=snapshot.value as!Dictionary
打印(“数据”,数据)
}
其他的
{
打印(“无数据”)
}
})
}
来自:

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

这对于只需加载一次且不需要频繁更改或需要主动侦听的数据非常有用。例如,前面示例中的博客应用程序在用户开始创作新文章时使用此方法加载用户的配置文件

observeSingleEvent将使用脱机缓存,并且不会在数据库发生更改时立即更新。这就是为什么你没有得到最新的数据。我以前有过这个问题,在获得数据后,我立即移除了观察者

您可以使用以下内容:

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
})
从:

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

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

来自:

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

这对于只需加载一次且不需要频繁更改或需要主动侦听的数据非常有用。例如,前面示例中的博客应用程序在用户开始创作新文章时使用此方法加载用户的配置文件

observeSingleEvent将使用脱机缓存,并且不会在数据库发生更改时立即更新。这就是为什么你没有得到最新的数据。我以前有过这个问题,在获得数据后,我立即移除了观察者

您可以使用以下内容:

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
})
从:

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

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