我正在尝试将我的firebase数据库数据放入一个变量中,以便在项目中使用它
var someArray = [Array]()
let dbRef = Database.database().reference().child("SomeDatabase")
func loadSomeDatabaseData {
dbRef.observeSingleEvent(of: .value) { (snapshot) in
let someDict = snapshot.value as! [String:Any]
let keysOfSomeDict = Array(someDict.keys)
self.someArray.append(contentsOf: keysOfSomeDict)
self.collectionView?.reloadData()
}
}
我尝试在viewDidload中调用loadSomeDatabaseData(),然后打印someArray,结果是一个空数组。我知道keysOfSomeDict数组有我想要的正确数据,因为我尝试在闭包中直接打印这个数组。然而,我也希望能够在我的应用程序中的其他地方打印和使用这些数据。
发布于 2019-12-23 14:06:15
Firebase的observeSingleEvent
方法是asynchronous
方法。它仅在后台执行,因为从Firebase获取数据需要时间。
如果你立即打印数组意味着你只能得到空数组。
所以一旦你从Firebase得到数据就打印数组。为此,您可以使用escaping closure
函数声明:
func loadSomeDatabaseData(resultArray : @escaping([Array])->()) {
dbRef.observeSingleEvent(of: .value) { (snapshot) in
let someDict = snapshot.value as! [String:Any]
let keysOfSomeDict = Array(someDict.keys)
self.someArray.append(contentsOf: keysOfSomeDict)
resultArray(self.someArray)
}
}
函数调用:
self.loadSomeDatabaseData{(firebaseReposne) in
print("FirebaseData" , firebaseReposne) // Hope here you will get your firebase data.
self.collectionView?.reloadData()
}
发布于 2019-12-23 02:48:48
observeSingleEvent
是异步的。因此,在调用loadSomeDatabaseData
之后立即打印someArray
将导致空数组。从Firebase api检索数据需要一些时间。
要在应用程序中的其他位置使用此数据,您可以设置一个指示数据已加载的标志,或发送通知以通知数据可用。
https://stackoverflow.com/questions/59447083
复制相似问题