iphone - iOS - How to make the tableview use paginated API output? -


an api writing has 2000 records, returned in json via simple restful api have written.

to reduce issues lots of data, want use pagination return first 10 or first 20 per request via offset or limit or page, etc.

but question how ios uitableview know when next page of results?

i unsure of how this. user scrolling superfast , api might not have enough time retrieve 20 or 50 records @ time.

another issue related is, lets user scrolls down on uitableview, , down again -- how prevent api firing multiple times same rows?

thanks

seems aren't thinking in terms of mvc . uitableview has little paging , webrequest. it's concerned datasource not pages.

restuful api design : assume web request designed follow :

/getrecorods?pagesize=20&pageno=2

this return array of json. in addition helpful have count parameter , link next page. helps in parsing , sync web server.

how prevent api firing multiple times same rows?

a simple flag sufficient avoid loading multiple pages. make sure flag accessed in main thread. actual webrequest needs go in background thread.

below code need put uitableviewcontroller loads data

  - (void)viewdidload {     [super viewdidload];     // additional setup after loading view, typically nib.      //call http util here load data     httputil.delegate = self;      //this retrieves post first page     currentpagenumber = 1;     [httputil getrecords:currentpagenumber];  }  - (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section {     // return number of rows in section.     int retvalue = 0;     if(recordsarray != nil){         retvalue = [recordsarray count];     }     return retvalue; }  - (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath {     static nsstring *cellidentifier = @"cell";      customcell *cell = [tableview dequeuereusablecellwithidentifier:cellidentifier];     if (cell == nil) {      }      // configure cell using recordsarray objectatindex      return cell; }   - (void)scrollviewdidscroll:(uiscrollview *)scrollview{        if(self.tableview.contentoffset.y >= (self.tableview.contentsize.height - self.tableview.bounds.size.height)) {        //nslog(@" scroll bottom!");       if(ispagerefresing == no){ // no need worry threads because on main thread.          ispagerefresing = yes;         [self showmbprofresshudonview:self.view withtext:@"please wait..."];         currentpagenumber = currentpagenumber +1;         [httputil getrecords:currentpagenumber];        }     }  }  // can pageno tag // make sure called in main thread -(void)didfinishrecordsrequest:(nsarray *)results forpage:(nsinteger)pageno{     if(pageno == 1){         recordsarray = [results mutablecopy];     }     else{         [recordsarray addobjectsfromarray:results];     }     ispagerefresing = no;     [self.tableview reloaddata]; }   -(void)didfailedchalkboardrequestwitherror:(nserror *)error{      //if since subsequent refresh calls(for page 2 or page 3 fails)     //then undo current page number     currentpagenumber--;     ispagerefresing = no; }  // http utility class -(void)getrecords:(nsinteger)pagenumber{      nsstring *serverurl = [nsstring stringwithformat:@"http://yourwebsite.com/page/%d /?json",pagenumber];      nslog(@"fetching stories data server url %@",serverurl);     nsurl *url = [nsurl urlwithstring:serverurl];     storiesrequest = [asihttprequest requestwithurl:url];     storiesrequest.tag = pagenumber;     [storiesrequest setdelegate:self];     [storiesrequest startasynchronous]; }  

Comments

Popular posts from this blog

java - WrongTypeOfReturnValue exception thrown when unit testing using mockito -

php - Magento - Deleted Base url key -

android - How to disable Button if EditText is empty ? -