Данные Firebase обрабатываются асинхронно.Даг Стивенсон написал отличный блог о том, почему это так и что это значит для разработчиков.Я также написал блог , где я показываю, как использовать замыкания в ваших функциях для обработки асинхронных данных.Хотя вы определенно можете вызывать loadNext()
изнутри observe
замыкания, вы можете обнаружить, что в конечном итоге вы получаете длинную последовательность замыканий внутри одной и той же функции.Я немного подробнее расскажу об этом в сообщении в блоге.В вашем конкретном случае вы можете сделать что-то вроде этого:
func getArray(completion: @escaping ([qtItem]) -> Void) {
let myRef1 = Database.database().reference(withPath: "/tests/\ .
(myTest)")
print(myTest)
myRef1.observe(.value, with: {
snapshot in
print(snapshot)
var newItems: [qItem] = []
for item in snapshot.children {
let mItem = qItem(snapshot: item as! DataSnapshot)
newItems.append(mItem)
print(newItems)
}
self.myArray = newItems.shuffled()
print(self.myArray)
completion(self.myArray)
})
}
Затем, когда вы звоните getArray()
, вы можете обрабатывать данные изнутри замыкания:
getArray() { newItems in
// do something with newItems, like pass to `loadNext()` if needed
self.loadNext()
}