当前位置: 首页 > 面试题库 >

iOS-如何使Tableview使用分页API输出?

凤伟泽
2023-03-14
问题内容

我正在编写的API大约有2000条记录,通过我编写的简单RESTful API以JSON返回。

为了减少大量数据的问题,我想使用分页,以便仅通过诸如offsetor limitpage等返回每个请求的前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将后续对象放置在新页面上。仅当您放置下一个对象时,才会真正创建新页面。另外,仅在当前页面不为空白时创建一个新页面;否则,仅创建一个新页面。否则,它将被忽略;您可以用来克服这一点。 请参见下面的链