我正在编写的API大约有2000条记录,通过我编写的简单RESTful API以JSON返回。
为了减少大量数据的问题,我想使用分页,以便仅通过诸如offset
or limit
或page
等返回每个请求的前10个或前20个。
但是我的问题是,iOS如何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];
}
我必须使用REST API获取数据并在Angular 2表中使用它。 所以我想知道哪一个是最好的解决方案: > 在API端处理分页、排序和过滤。因此API将只返回要显示在当前页面中的数据。使用此方法将需要多次调用API,因为每个操作都会引发API调用。 API返回所有数据,分页/筛选/排序将使用Angular 2进行管理。
背景: 默认情况下,列出IAM用户的AWS操作返回的最大值为50。 阅读下面的文档(链接),我运行下面的代码,并通过将“MaxItems”设置为1000返回完整的数据集。 http://boto3.readthedocs.io/en/latest/guide/paginators.html https://boto3.readthedocs.io/en/latest/reference/servi
问题内容: 我可以使用json解析代码成功工作tableview。但是可能还有1000多个项目,因此在滚动底部时需要分页。我不知道如何在下面执行我的代码。对于Objective-C,有很多例子,但是为了迅速,我没有找到有效的例子。我在等你的帮助。我认为会帮助太多人。谢谢 ! 问题答案: 为此,您还需要更改服务器端。 服务器将接受并在url中作为查询参数。 在服务器响应中,将有一个额外的密钥。这将用
我有一个来自URL的分页响应,我想继续点击我从上一个响应中获得的下一页URL,并继续收集项目,直到我的响应中没有“nextPage”URL。如何使用WebFlux的Spring引导WebClient在没有阻塞的情况下以反应式方式实现这一点? 在这里,我创建了模拟网址https://karthikdivi.com/apps/paginatedReviews/withNextPageTokens/it
问题内容: 我有一个分类广告网站…我让Solr搜索分类广告,然后返回ID:nrs,然后将其用于放置到数组中。然后,我使用此数组在MySql数据库中找到所有分类,其中ID:s与Solr返回的数组中的ID:s相匹配。 现在,由于此数组可能非常大(十万个记录或更多),因此我需要“分页”结果,以便一次返回100个。然后在MySql中使用这100个ID:来查找分类。 那么,是否可以使用SOLR进行分页? 如
问题内容: 我想使用itext生成pdf。我会在某些时候添加内容以进行分页。我需要插入几个单独的conenidos依赖源,所以我要求用户在单独的页面上插入。有任何想法吗??? 问题答案: 调用告诉iText将后续对象放置在新页面上。仅当您放置下一个对象时,才会真正创建新页面。另外,仅在当前页面不为空白时创建一个新页面;否则,仅创建一个新页面。否则,它将被忽略;您可以用来克服这一点。 请参见下面的链