json - Pagination while scrolling in Swift Firebase -


i loading data firebase database. trying load data while user scrolls. example if has scrolled 20 cells want load little more 5 cells. trying achieve not working:

func parsesnusbrands(){         let ref = firdatabase.database().reference().child("snuses").child("brands")          ref.queryorderedbykey().querylimitedtolast(20).observeeventtype(.value, withblock: { (snapshot) in             if snapshot.exists() {                 if let = (snapshot.value?.allkeys)! as? [string]{                     self.snusbrandsarray =                     self.snusbrandstableview.reloaddata()                  }             }         })     } 

and detect how many cells scrolled:

override func tableview(tableview: uitableview, willdisplaycell cell: uitableviewcell, forrowatindexpath indexpath: nsindexpath) {     if indexpath.row == 20 {         let ref = firdatabase.database().reference().child("snuses").child("brands")          ref.queryorderedbykey().querylimitedtolast(20).observeeventtype(.value, withblock: { (snapshot) in             if snapshot.exists() {                 if let = (snapshot.value?.allkeys)! as? [string]{                     self.snusbrandsarray =                     self.snusbrandstableview.reloaddata()                  }             }         })     } } 

this firebase structure:

enter image description here

is there better solution or should keep trying this?

here can see whole code. know lacks of oo learning :)

you may want use offset achieve pagination in app.

first, add order key in child path, may current time stamp of insertion can order , use in pagination.

for eg.

"brands": {          "catch" : {            ...            ...            "porder" : 555          },          "etan" : {            ...            ...            "porder" : 444          },          "general" : {            ...            ...            "porder" : 555          }.          .....        } 

now, achieve pagination retrieve 21 records , in records, first 20 records use in table view, while last record offset used retrieve next set of records.

create function fetches data firebase:

 // mark: retrieving data: firebase     /*      retrieve current set of posts sorted updated time of posts      */     func retrievepost(offset: nsnumber, callflag: bool, completion: (result: anyobject?, error: nserror?)->()){         // method called viewdidload , fetches 20 records @ first.         // later when user scrolls down bottom, called again         let postsref = ref.child(kdbpostref)         var startingvalue:anyobject?         // starting  value nil when method called viewdidload offset not set          if callflag{             if offset == 0{                 startingvalue = nil             }             else{                 startingvalue = offset             }         } else{             // offset offsetarray             startingvalue = self.findoffsetfromarray()          }         // sort records porder fetch offset+1 records         self.refhandler = postsref.queryorderedbychild("porder").querystartingatvalue(startingvalue).querylimitedtofirst(kpostlimit + 1).observeeventtype(firdataeventtype.value, withblock: { (snapshot) in             // flag setting last record/ 21st offset             var flag = 0              let temppost = nsmutableset()                 // iterate on children , add temppost                 item in snapshot.children {                      // check offet, last row(21st) offset ; not add last element in main table list                     flag += 1                     if flag == 21 && callflag == true{                         // row offset                         self.koffset = item.value?["porder"] as! nsnumber                         self.offsetarray?.append(self.koffset)                         continue                     }                     // create post object                     let post = post(snapshot: item as! firdatasnapshot)                      // append temppost                     temppost.addobject(post)                 }                 // return closure                 completion(result:temppost, error:nil)         })     } 

and call updatenewrecords method viewdidload, passing 0 retrieve first 20 records.

 func updatenewrecords(offset:nsnumber, callflag: bool){         self.retrievepost(offset,callflag:callflag) { (result,error) -> void in //            let temparray = result as! [post]             let oldset = set(self.posts)             var unionset = oldset.union(result as! set<post>)             unionset = unionset.union(unionset)             self.posts = array(unionset)             self.postscopy = self.posts //          print(self.posts.count)             self.posts.sortinplace({ $0.porder> $1.porder})             self.reloadtabledata()         }     } 

again when user scrolls bottom in table view, call method, updatenewrecords passing offset, retrieve next set of 20 records.

func scrollviewdidenddragging(scrollview: uiscrollview, willdecelerate decelerate: bool) {          // uitableview moves in 1 direction, y axis         let currentoffset = scrollview.contentoffset.y         let maximumoffset = scrollview.contentsize.height - scrollview.frame.size.height          // change 10.0 adjust distance bottom         if maximumoffset - currentoffset <= 10.0 {             self.updatenewrecords(self.koffset, callflag:true)         }     }  

you can maintain array offsetarray updating table values when data modified in firebase .

for e.g. suppose data modified somewhere in table, in case observeeventtype called , should fetch range of records firebase. can achieve using maintaining array of offsets. when record updated, retrievepost called corresponding offset offsetarray. in normal case, ( while retrieving data viewdidload , scrollviewdidenddragging), offset koffset , in rest of cases(while listening data change), offset offsetarray.

you can define function return offset value particular updated column:

// find offset offsetdict     func findoffsetfromarray() -> nsnumber{         let idx = self.kclickedrow/20 // kclickedrow updated row in table view         return self.offsetarray![idx]      } 

you can modify retrievepost method , pass parameter retrieve number of records.


Comments