В данный момент вызов завершения находится за пределами замыкания для вызова базы данных, поэтому он вызывается сразу перед возвращением данных.Если вы переместите его в закрытие, вы сможете получить доступ к информации, когда захотите.Это сообщение в блоге, которое я написал , может помочь вам лучше понять, как обрабатывать замыкания.
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
}