Paginating Firestore Data with Swift

442 views
Skip to first unread message

apps...@gmail.com

unread,
Nov 11, 2017, 11:17:14 AM11/11/17
to Firebase Google Group
Hi,

I wan't to paginate my data (10 posts per page) from Firestore using below code,

import UIKit
import FirebaseFirestore
class Home: UITableViewController {


   
var postArray = [postObject]()
    let db
= Firestore.firestore()
   
var page : DocumentSnapshot? = nil
    let pagingSpinner
= UIActivityIndicatorView(activityIndicatorStyle: .gray)

   
override func viewDidLoad() {
       
super.viewDidLoad()

       loadFirstPage
()
   
}


    func loadFirstPage
(){

       
// Get the first 10 posts

        db
.collection("POSTS").limit(to: 10).addSnapshotListener { (snapshot, error) in
           
if snapshot != nil {
               
self.postArray = (snapshot?.documents.flatMap({postObject(dec : $0.data())}))!

               
// Save the last Document

               
self.page = snapshot?.documents.last
               
self.tableView.reloadData()
           
}
       
}
   
}

    func loadNextPage
(){

       
// get the next 10 posts

        db
.collection("POSTS").limit(to: 10).start(afterDocument: page!).addSnapshotListener { (snapshot, error) in
           
if snapshot != nil {

               
for doc in (snapshot?.documents)! {

                   
self.postArray.append(postObject(dec: doc.data()))
               
}

               
self.page = snapshot?.documents.last

               
self.tableView.reloadData()

           
}

       
}

   
}


   
override func numberOfSections(in tableView: UITableView) -> Int {

       
return 1
   
}

   
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

       
return postArray.count
   
}


   
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell
= tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as? postCell

       
// display data

        cell
?.textLabel?.text = postArray[indexPath.row].name

       
return cell!
   
}


   
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

       
// check index to load next page

       
if indexPath.row < (self.postArray.count){


            pagingSpinner
.startAnimating()
            pagingSpinner
.color = UIColor.red
            pagingSpinner
.hidesWhenStopped = true
            tableView
.tableFooterView = pagingSpinner
            loadNextPage
()


       
}

   
}


}


But i have faced the following issues :

  • if i start to post something for the first time (FireStore has no data at all) from other devices the app will crash because the page will always be nil.
  • I tried to insert 10 post by the console and check the app when I start scrolling down with my table view it will crash for the same reason page is nil.

I'm wondering why is this happening although I'm saving the last Sanpshot document as pagination cursor ! is there a better why to implement the pagination with Swift

Reply all
Reply to author
Forward
0 new messages