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:
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
Post a Comment