使用完成处理程序从 Firebase 中的子项获取初始键值 IOS
Get initial key values from children in Firebase using completion handler IOS
我想从 Firebase 中先前设置的数据列表中获取键的数量,然后是键值。我正在尝试完全理解完成处理程序,但我可能还没有做到。为什么这个 return 是一个空数组?或者至少在下一个函数(在此代码之外)运行之前不填充数据?谢谢!
//Initial data download from Firebase
func getKeys(completion: @escaping () -> Void) {
Database.database().reference().child("food").observe(.value) { (snapshot) in
//Get count of how many child "apples"
Let childApplesCount = Int(snapshot.childrenCount)
//Get each key
for child in snapshot.children {
let snap = child as! DataSnapshot
let key = snap.key
print("keys in snapshot: \(key)")
//Append to an array of keys for later use
self.onloadKeyArray.append(key)
}
}
completion()
}
现在,完成调用在数据库调用的闭包之外,因此它会在数据返回之前立即被调用。如果将其移入闭包中,您将能够在需要时访问信息。 blog post I wrote 可能有助于您更好地了解处理闭包。
func getKeys(completion: @escaping () -> Void) {
Database.database().reference().child("food").observe(.value) { (snapshot) in
//Get count of how many child "apples"
Let childApplesCount = Int(snapshot.childrenCount)
//Get each key
for child in snapshot.children {
let snap = child as! DataSnapshot
let key = snap.key
print("keys in snapshot: \(key)")
//Append to an array of keys for later use
self.onloadKeyArray.append(key)
}
completion()
}
}
此外,如果您需要闭包外的这些数据,最好将其传递给完成处理程序,如下所示:
func getKeys(completion: @escaping ([String]) -> Void) {
keyArray = [String]()
Database.database().reference().child("food").observe(.value) { (snapshot) in
//Get count of how many child "apples"
Let childApplesCount = Int(snapshot.childrenCount)
//Get each key
for child in snapshot.children {
let snap = child as! DataSnapshot
let key = snap.key
print("keys in snapshot: \(key)")
//Append to an array of keys for later use
keyArray.append(key)
}
completion(keyArray)
}
}
然后当您调用该函数时,您将拥有该数组。这使您能够将数据功能与视图控制器分开。
yourClass.getKeys() { keyArray in
self.keys = keyArray
}
我想从 Firebase 中先前设置的数据列表中获取键的数量,然后是键值。我正在尝试完全理解完成处理程序,但我可能还没有做到。为什么这个 return 是一个空数组?或者至少在下一个函数(在此代码之外)运行之前不填充数据?谢谢!
//Initial data download from Firebase
func getKeys(completion: @escaping () -> Void) {
Database.database().reference().child("food").observe(.value) { (snapshot) in
//Get count of how many child "apples"
Let childApplesCount = Int(snapshot.childrenCount)
//Get each key
for child in snapshot.children {
let snap = child as! DataSnapshot
let key = snap.key
print("keys in snapshot: \(key)")
//Append to an array of keys for later use
self.onloadKeyArray.append(key)
}
}
completion()
}
现在,完成调用在数据库调用的闭包之外,因此它会在数据返回之前立即被调用。如果将其移入闭包中,您将能够在需要时访问信息。 blog post I wrote 可能有助于您更好地了解处理闭包。
func getKeys(completion: @escaping () -> Void) {
Database.database().reference().child("food").observe(.value) { (snapshot) in
//Get count of how many child "apples"
Let childApplesCount = Int(snapshot.childrenCount)
//Get each key
for child in snapshot.children {
let snap = child as! DataSnapshot
let key = snap.key
print("keys in snapshot: \(key)")
//Append to an array of keys for later use
self.onloadKeyArray.append(key)
}
completion()
}
}
此外,如果您需要闭包外的这些数据,最好将其传递给完成处理程序,如下所示:
func getKeys(completion: @escaping ([String]) -> Void) {
keyArray = [String]()
Database.database().reference().child("food").observe(.value) { (snapshot) in
//Get count of how many child "apples"
Let childApplesCount = Int(snapshot.childrenCount)
//Get each key
for child in snapshot.children {
let snap = child as! DataSnapshot
let key = snap.key
print("keys in snapshot: \(key)")
//Append to an array of keys for later use
keyArray.append(key)
}
completion(keyArray)
}
}
然后当您调用该函数时,您将拥有该数组。这使您能够将数据功能与视图控制器分开。
yourClass.getKeys() { keyArray in
self.keys = keyArray
}