如何从UITableView中的Web服务加载大量数据?

时间:2012-03-15 14:23:38

标签: ios web-services uitableview

我目前正在构建一个具有UITableView的应用程序,该应用程序将从Web服务获取数据。返回的数据可以包含大量记录,例如50,000条记录。我知道所有记录都不能一次加载到一个数组中,这会因为缺少内存而使应用程序无响应。我正在调用的Web服务接收页面大小和页码的参数,因此它只返回我想要显示给用户的数据。但是我没有找到任何方法表明用户已经滚动了所有显示的记录并需要从服务中获取新数据。屏幕还有一个搜索栏和一个搜索按钮,按下该按钮将调用另一个返回搜索结果的服务。这会产生与之前相同的问题,因为结果也会带来大量记录。

最好的方法是什么?

2 个答案:

答案 0 :(得分:8)

好的,有几种方法可以解决这个问题。 非常受欢迎的是three20 framework(支持Internet的表视图控制器)

的实现

至于你的第二个问题,tableview的代表有一个方便的方法:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

<强>更新

完全一年后发布此答案后,我建议您使用RestKit。许多人认为它有一个陡峭的学习曲线,但它是处理休息资源的一个非常好的框架,包括缓存管理,核心数据集成/映射和分页器(以及其他),几乎涵盖了所有需求。

答案 1 :(得分:3)

我们目前在我们的应用程序中做了类似的事情。由于UITableView继承自UIScrollView,您可能希望利用一些UIScrollView的属性和方法。您几乎肯定希望实现符合UIScrollView委托的类。然后,当用户滚动到UITableView中当前加载的记录的底部时,您可以在Web服务中查询下一页数据。 UIScrollView的文档是here,UIScrollViewDelegate here的文档。

这是UIScrollViewDelegate的scrollViewDidScroll:方法的示例实现,它可以让您在用户到达滚动视图底部时加载记录。

- (void) scrollViewDidScroll:(UIScrollView *) scrollView {
    // Calculate whether the user has reached the bottom of the scroll view.
    CGPoint offset = scrollView.contentOffset;
    CGRect bounds = scrollView.bounds;
    CGSize size = scrollView.contentSize;
    UIEdgeInsets inset = scrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;
    float reload_distance = 0;
    if (y >= h + reload_distance) {
        // Request next page of data here.
    }
}

UITableViewDataSource方法的优点在于它们不要求您将数据存储在内存中。您可以在调用tableView:cellForRowAtIndexPath:时为按需请求的每个单元提供必要的数据。同样,您可以提供从tableView:numberOfRowsInSection:返回的值,而不实际拥有内存中行的所有数据。但是,您很可能希望保留内存中单元格中当前查看的单元格数据,以确保合理的性能。不幸的是,这可能都很棘手,但它应该是可能的。您可以找到有关UITableDataSource here的更多文档。