一尘不染

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

json

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

为了减少大量数据的问题,我想使用分页,以便仅通过诸如offsetor limitpage等返回每个请求的前10个或前20个。

但是我的问题是,iOS如何UITableView知道何时获得下一页结果?

我真的不确定如何执行此操作。用户可能正在快速滚动,因此API可能没有足够的时间一次检索20或50条记录。

与此相关的另一个问题是,假设用户在UITableView上向下滚动,然后向上然后再次向下滚动-您如何防止API针对同一行多次触发?

谢谢


阅读 248

收藏
2020-07-27

共1个答案

一尘不染

似乎您不是在考虑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];
}
2020-07-27