Не имеет отношения к вопросу, но вызовы пользовательского интерфейса в замыканиях Firebase выполняются в главном потоке, поэтому вы можете удалить DispatchQueue.
Не думаю, что ваш код очень далек. Я переписал его для разбивки на страницы загрузки пользователей 3 по возрасту, и приведенный ниже код работает правильно.
Посмотрите и сравните с вашим кодом. Каждый раз, когда он вызывается, он загружается в следующих трех пользователей.
var lastDocumentSnapshot: DocumentSnapshot?
func observeUsersWithPagination() {
var query: Query!
let usersCollectionRef = self.db.collection("users")
if let nextStartingSnap = self.lastDocumentSnapshot {
query = usersCollectionRef.order(by: "age", descending: false).start(afterDocument: nextStartingSnap).limit(to: 3)
} else {
query = usersCollectionRef.order(by: "age", descending: false).limit(to: 3)
}
query.addSnapshotListener { querySnapshot, error in
guard let snapshot = querySnapshot else {
print("Error fetching snapshots: \(error!)")
return
}
self.lastDocumentSnapshot = snapshot.documents.last
snapshot.documentChanges.forEach { diff in
let userName = diff.document.get("name") as? String ?? "No Name"
let age = diff.document.get("age") as? Int ?? 0
if (diff.type == .added) {
print("Added user: \(userName)", age)
}
if (diff.type == .modified) {
print("Modified user: \(userName)", age)
}
if (diff.type == .removed) {
print("Removed user: \(userName)", age)
}
}
}
}
Не ясно, действительно ли documentChanges.forEach необходим.