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