Я пытался получить постраничные данные, но по какой-то причине я не смог сделать это правильно. Я делал отладку довольно много раз, но при отсутствии каких-либо ошибок кажется, что это ожидаемое поведение от Firestore getDocuments. Буду признателен за любую помощь -> Я пытаюсь вернуть переменную posts из метода, описанного ниже
private var query: Query
private var documents: [QueryDocumentSnapshot] = []
init() {
let db = Firestore.firestore()
self.query = db.collection("posts").order(by: "createdTimeStamp")
}
func updateQuery() -> Query{
let nextQuery: Query
if let lastDocument = documents.last {
nextQuery = query.start(afterDocument: lastDocument).limit(to: 5)
} else {
nextQuery = query.limit(to: 5)
}
return nextQuery
}
public func fetchNext() -> [ObjectPost] {
var posts: [ObjectPost] = []
let updatedQuery = updateQuery()
updatedQuery.getDocuments(completion: { (querySnapshot, error) in
if let e = error {
print(e.localizedDescription)
}
guard let snapshot = querySnapshot else {
print("Error fetching next documents: \(error!)")
return
}
let newPosts = snapshot.documents.map { doc -> ObjectPost in
let post = try! FirestoreDecoder().decode(ObjectPost.self, from: doc.data())
print("post \(post.postBody)")
return post
}
posts += newPosts
print("--After posts update")
self.documents += snapshot.documents
print("--After documents update")
})
print("Before returning posts")
return posts
}
Я могу связаться до «После обновления документов», но он никогда не достигнет «До возвращения сообщений», а также сообщения никогда не возвращаются. Что мне здесь не хватает?
ОБНОВЛЕНИЕ: Для тех, кто читает это как средство для решения своих собственных запросов, мне не хватало асинхронной природы API-интерфейсов Firebase, что очень хорошо объяснено здесь https://medium.com/firebase-developers/why-are-firebase-apis-asynchronous-callbacks-promises-tasks-e037a6654a93 и здесь https://firebase.googleblog.com/2018/07/swift-closures-and-firebase-handling.html