I try to find a solution for paginate a firebase query on ios/swift but I couldn't build algorithm for my state.
My method is like this:
func downloadData(completion: @escaping ([Post]) -> Void) {
        
        // download data with pagination
        
        let firestoreDatabase = Firestore.firestore()
        
        var first =  firestoreDatabase.collection("posts").order(by: "date", descending: true).limit(to: 5)
        
        first.addSnapshotListener{ snapshot, error in
            
            guard let snapshot = snapshot else {
                print("Error retrieving cities: \(error.debugDescription)")
                return
            }
            
            guard let lastSnapshot = snapshot.documents.last else {
                // The collection is empty.
                return
            }
            
            self.postList.removeAll(keepingCapacity: false)
            
            DispatchQueue.global().async {
                
                for document in snapshot.documents {
                    
                    // getting data from document stuff ...
                    
                    self.postList.append(self.post)
                }
                
                completion(self.postList)
            }
            
            // how can I repeat this query as long as lastSnapshot exist
            firestoreDatabase.collection("posts").order(by: "date", descending: true).start(afterDocument: lastSnapshot).addSnapshotListener { querySnapshot, error in
            }
        }
}
I tried following mindset but it didn't work, and entered an infinite loop. I didn't understand why it is.
func downloadData(completion: @escaping ([Post]) -> Void) {
        
        // download data with pagination
        
        let firestoreDatabase = Firestore.firestore()
        
        var first =  firestoreDatabase.collection("posts").order(by: "date", descending: true).limit(to: 5)
        
        first.addSnapshotListener{ snapshot, error in
            
            guard let snapshot = snapshot else {
                print("Error retrieving cities: \(error.debugDescription)")
                return
            }
            
            guard let lastSnapshot = snapshot.documents.last else {
                // The collection is empty.
                return
            }
            
            self.postList.removeAll(keepingCapacity: false)
            
            DispatchQueue.global().async {
                
                for document in snapshot.documents {
                    
                    // geting data from document stuff ...
                    
                    self.postList.append(self.post)
                }
                
                completion(self.postList)
            }
            repeat {
                firestoreDatabase.collection("posts").order(by: "date", descending: true).start(afterDocument: lastSnapshot).addSnapshotListener { querySnapshot, error in
                    
                    guard let snapshot = snapshot else {
                        print("Error retrieving cities: \(error.debugDescription)")
                        return
                    }
                    
                    guard let lastSnapshot = snapshot.documents.last else {
                        // The collection is empty.
                        return
                    }
                    
                    self.postList.removeAll(keepingCapacity: false)
                    
                    DispatchQueue.global().async {
                        
                        for document in snapshot.documents {
                            
                            // getting data from document stuff ...
                            
                            self.postList.append(self.post)
                        }
                        
                        completion(self.postList)
                    }
                    
                    lastSnapshot = snapshot.documents.last
                }
            } while(lastSnapshot.exists)
        }
}
I think lastSnapshot must be nil after the query loop but it is appear that it is still exist.
how can I fix lastSnapshot problem? Or is there different mindset / easiest way to paginate?
In firebase documents, it says just use this but how can we repeat query that has " .start(afterDocument: lastSnapshot) " stuff?