我正在编写的API大约有2000条记录,通过我编写的简单RESTful API以JSON返回。
为了减少大量数据的问题,我想使用分页,以便仅通过诸如offsetor limit或page等返回每个请求的前10个或前20个。
offset
limit
page
但是我的问题是,iOS如何UITableView知道何时获得下一页结果?
UITableView
我真的不确定如何执行此操作。用户可能正在快速滚动,因此API可能没有足够的时间一次检索20或50条记录。
与此相关的另一个问题是,假设用户在UITableView上向下滚动,然后向上然后再次向下滚动-您如何防止API针对同一行多次触发?
谢谢
似乎您不是在考虑MVC。您的UITableView与分页和webrequest几乎没有关系。它只关心其数据源而不是页面。
Restuful API设计:假设您的Web请求设计如下:
/ getRecorods?pageSize = 20&pageNo = 2
这将返回一个JSON数组。除此之外,拥有一个count参数和指向下一页的链接也很有帮助。这有助于解析和与Web服务器同步。
如何防止API针对同一行多次触发?
一个简单的标志足以避免加载多个页面。只要确保在主线程中访问了该标志即可。实际的webrequest需要进入后台线程。
下面是您需要放入可加载数据的UITableViewController中的代码
-(void)viewDidLoad { [super viewDidLoad]; //加载视图后,通常从笔尖进行其他任何设置。 //在此处调用http Util加载数据 httpUtil.delegate =自我; //这总是检索首页的帖子 currentPageNumber = 1; [httpUtil getRecords:currentPageNumber]; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)节 { //返回该节中的行数。 int retValue = 0; if(recordsArray!= nil){ retValue = [recordsArray计数]; } 返回retValue; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 静态NSString * CellIdentifier = @“ Cell”; CustomCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell == nil){ } //使用recordsArray objectAtIndex配置单元格 返回单元 } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { if(self.tableView.contentOffset.y> =(self.tableView.contentSize.height-self.tableView.bounds.size.height)){ // NSLog(@“滚动到底部!”); if(isPageRefresing == NO){//不必担心线程,因为它始终在主线程上。 isPageRefresing = YES; [self showMBProfressHUDOnView:self.view withText:@“请稍候...”]; currentpagenumber = currentpagenumber +1; [httpUtil getRecords:currentpagenumber]; } } } //您可以从标记获取pageNo //确保在主线程中调用了此方法 -(void)didFinishRecordsRequest:(NSArray *)结果为Page:(NSInteger)pageNo { if(pageNo == 1){ recordsArray = [results mutableCopy]; } 其他{ [recordsArray addObjectsFromArray:results]; } isPageRefresing = NO; [self.tableView reloadData]; } -(void)didFailedChalkBoardRequestWithError:(NSError *)错误{ //如果由于后续刷新调用(对于第2页或第3页)失败 //然后撤消当前页码 currentpagenumber--; isPageRefresing = NO; } // HTTP Utility类 -(void)getRecords:(NSInteger)pageNumber { NSString * serverUrl = [NSString stringWithFormat:@“ http://yourwebsite.com/page/%d /?json”,pageNumber]; NSLog(@“使用URL%@从服务器获取故事数据”,serverUrl); NSURL * url = [NSURL URLWithString:serverUrl]; storyRequest = [ASIHTTPRequest requestWithURL:url]; storyRequest.tag = pageNumber; [storiesRequest setDelegate:self]; [storiesRequest startAsynchronous]; }