UITableView通过删除现有记录来加载记录

时间:2016-03-21 10:25:24

标签: ios objective-c uitableview lazy-loading

实际上我想在UITableView中显示记录,记录总数可能会超过 100千。因此,每当用户滚动达到70%的记录(第70行)时,我就会将这些记录加载到 100条记录的块中。

我不想在内存中保留现有的大块记录,所以最初我加载2个100块记录的块,当用户滚动到达第170行时,我删除前100条记录并加载1块100块记录。

但我的问题是如何重置indexPath的值?目前它的值是170,但是在加载了100个记录的新块并删除前100个记录之后,我希望它的值为70。

我通过使用以下代码行找到了解决上述问题的方法。

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:70 inSection:indexPath.section] atScrollPosition:UITableViewScrollPositionBottom  animated:NO];

但是上面的代码行突然停止滚动。所以看起来像第70行突然停止滚动。

是否有其他解决方案可以实现上述问题,提前致谢。

1 个答案:

答案 0 :(得分:0)

为什么不允许用户以其他方式访问数据,例如:

  1. 搜索功能
  2. 数据的子类别
  3. 这也许值得一提,因为它的数据如此庞大,您的用户是否真的可能会滚动到那么远的地方,如果必须这样做,是否会对用户体验造成负面影响?

    为了论证,如果你想保护你的内存使用,你必须根据偏移量动态添加和删除单元格。标准的UITableview方法可以很好地为您完成这项工作。

    在任何情况下,您在任何时候分配的单元格数量都应考虑到您放入单元格的内容,例如图像与文本。如果它的图像,则100k将导致大量的应用程序包(除非您根据需要从服务器中提取它们)。如果是文本,请使用Apple自己的UITableView方法,因为它们会更有效。

    但是,如果您对这种方法非常坚定,并希望推出自己的自定义修补程序,则可以在UIScrollView中布局一堆UIViews,并使用UIScrollView的contentOffset知道何时添加和删除单元格。实际添加的单元格应在屏幕外完成。

    A. 在scrollViewDidScroll中,请注意与cellHeights对齐的特定偏移量,例如

    if(fabsf(y)%200==0){
       //add new cells below, drop old cells at the top
    }
    
    如果您的细胞高度为50px,则每4个细胞就会达到此方法。

    B。每次添加新单元格/删除旧单元格时,都要更新动态索引路径。它将是最上层单元格的indexPath。在此基础上,您可以计算当前“已分配”的单元格数量。以及从数组中提取单元格数据的点:

    for (int n = dynamicIndexPath; n<dynamicIndexPath+numberOfCells; n++){
       //this is the window onto your data.
    }
    

    添加例如4个新细胞:

    for (int n = dynamicIndexPath + numberOfCells-4; n<4; n++){
       //[self layoutNewCellWithData:massiveArray[n] atOffset:y];
    }
    

    这将是一种本土的UITableview(UIScrollView中的UIViews),您可以在其中处理自己的队列。

    但是,如果是我,我会考虑另一种攻击数据的方法,例如通过搜索或某种方式将数据分成更小的组。如果我没有使用Apple的UITableView方法,那就失败了我自己。