Pagination with Firebase firestore - swift 4

前端 未结 4 948
情书的邮戳
情书的邮戳 2021-02-03 15:08

I\'m trying to paginate data (infinitely scroll my tableview) using firestore. I\'ve integrated the code google gives for pagination as best I can, but I\'m still having problem

4条回答
  •  情歌与酒
    2021-02-03 15:58

    So here's the solution I've come up with! It is very likely that this solution makes multiple calls to firestore, creating a large bill for any real project, but it works as a proof of concept I guess you could say.

    If you have any recommendations or edits, please feel free to share!

    Here's how all the variables were initialized:

    var rides = [Ride]()
    var lastDocumentSnapshot: DocumentSnapshot!
    var fetchingMore = false
    

    If you have any recommendations or edits, please feel free to share!

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let offsetY = scrollView.contentOffset.y
        let contentHeight = scrollView.contentSize.height
        //print("offsetY: \(offsetY) | contHeight-scrollViewHeight: \(contentHeight-scrollView.frame.height)")
        if offsetY > contentHeight - scrollView.frame.height - 50 {
            // Bottom of the screen is reached
            if !fetchingMore {
                paginateData()
            }
        }
    }
    
    // Paginates data
    func paginateData() {
    
        fetchingMore = true
    
        var query: Query!
    
        if rides.isEmpty {
            query = db.collection("rides").order(by: "price").limit(to: 6)
            print("First 6 rides loaded")
        } else {
            query = db.collection("rides").order(by: "price").start(afterDocument: lastDocumentSnapshot).limit(to: 4)
            print("Next 4 rides loaded")
        }
    
        query.getDocuments { (snapshot, err) in
            if let err = err {
                print("\(err.localizedDescription)")
            } else if snapshot!.isEmpty {
                self.fetchingMore = false
                return
            } else {
                let newRides = snapshot!.documents.compactMap({Ride(dictionary: $0.data())})
                self.rides.append(contentsOf: newRides)
    
                //
                DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
                    self.tableView.reloadData()
                    self.fetchingMore = false
                })
    
                self.lastDocumentSnapshot = snapshot!.documents.last
            }
        }
    }
    

提交回复
热议问题