带有infite滚动和延迟加载的UITableView

Wim*_*tra 11 iphone cocoa-touch ios

我得到了一个UITableView充满未知数量的行.每行包含(例如3个)图像,应用程序从Web服务收集此信息.

UITableView我实现无限滚动.每当表几乎达到当前行数的末尾时,我就会启动对webservice的调用,以获取接下来的50行数据.我在这个scrollViewDidScroll方法中执行此操作UITableView.

- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat actualPosition = scrollView.contentOffset.y;

    float bottomOffset = 450;
    if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
        bottomOffset = 1000;

    CGFloat contentHeight = scrollView.contentSize.height - bottomOffset;
    if (actualPosition >= contentHeight && !_loading && !_cantLoadMore)
    {
        self.loading = YES;

        _currentPage++;

        NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
        [dict setObject:[NSNumber numberWithInt:_currentPage] forKey:@"page"];
        [dict setObject:[_category objectForKey:@"ID"] forKey:@"category"];

        [self performSelectorInBackground:@selector(getWallpapersInBackground:) withObject:dict];
    }
}
Run Code Online (Sandbox Code Playgroud)

行中的图像UITableView是延迟加载的.每当一行可见时,图像将被加载到一个单独的线程中,并且一旦完全下载图像就会更新行.我用于延迟加载的原则与Apple在其文档中建议的相同.图像也被添加到本地NSDictionary,因此当行滚出屏幕并返回时(我重新创建行),我可以获取它.

由于单个视图中的图片数量可以达到2000 - 3000,因此我还会将图像缓存到磁盘并清除图像,这些图像距离NSDictionaryX行以外的距离.当用户向下滚动并再次向上滚动时,会发生以下情况:

  1. 显示新行
  2. 调用延迟加载方法,该方法检查图像是否存在于磁盘上或者应该下载它.
  3. 从磁盘下载或获取映像时,它会执行一个代码块,该代码块在行中显示图像.从Internet下载的图像也会缓存到磁盘.
  4. UIImage添加以便NSDictionary更快地缓存需要触及的图像.
  5. NSDictionary由于内存问题(导致内存不足错误的UIImage对象太多),从行中删除了15行或更远的可见行的图像NSDictionary.

当UITableView几乎到达结尾时,会发生以下情况:

  1. UITableView几乎到达当前加载的行的末尾
  2. 调用webservice,加载新行(50)
  3. 新行将添加到数组中,该数组用于该numberOfItemsInSection方法.
  4. reloadData调用A 以确保UITableView填充额外的新行.
  5. 包含图像的新行,执行上述步骤以延迟加载图像.

所以,我遇到的问题是当我从webservice添加新记录时.当我调用reloadDataon时,UITableView一些图像再次从磁盘加载,并且在滚动时发生一些hickup.

我正在为此寻找解决方案.我尝试使用insertItemsAtIndexPaths新行的数量,将它们添加到UITableView,但这使得我的延迟加载方法已经下载了图像(因为不知何时所有单元格都是在那时创建的,即使它们不可见,检查单元格是否为在创建过程中可见会产生意外结果,图像无法加载,单元格看起来很奇怪等等.

所以,我基本上是在找的是一个无限滚动的UITableView,从网络/磁盘延迟加载图像并作为照片应用作为平滑的解决方案.由于图像都是在不同的线程中加载的,我不明白为什么滚动不像婴儿的皮肤那么光滑.

Jef*_*mas 15

我不确定我是否完全了解你的问题,但是在遇到类似的问题时我会做一些事情.

  • 我用-tableView:cellForRowAtIndexPath:我的提示从网上加载更多数据.当我indexPath.row + 10 >= self.data.count加载更多数据时,我选了一个数字(在我的情况下为10).

    • -tableView:cellForRowAtIndexPath:无论如何我还需要打电话.
    • 我没有强制回调到更严格的循环-scrollViewDidScroll:.
  • 我继承UIImageView了一个类,它会异步加载我调用的图像URLImageView.

    • -tableView:cellForRowAtIndexPath:,我为URLImageView实例分配了一个URL .
    • 该分配导致后台操作从磁盘加载或从Web加载.
    • 该操作是可取消的,因此我没有继续处理不再需要加载的图像.

我有一张包含数百张(但不是数千张)图像的桌面视图.我一次只在屏幕上有2或3个表格单元格.

  • 我用过-refreshData:它像冠军一样工作.
  • 我甚URLImageView至淡化了图像.这是一个非常好的效果.

我希望有所帮助.