gpt4 book ai didi

iphone - 具有无限滚动和延迟加载的 UITableView

转载 作者:技术小花猫 更新时间:2023-10-29 10:46:47 24 4
gpt4 key购买 nike

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

对于 UITableView,我实现了无限滚动。每当表几乎达到当前行数的末尾时,我都会启动对 web 服务的调用,以获取接下来的 50 行数据。我在 UITableView 调用的 scrollViewDidScroll 方法中执行此操作。

- (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];
}
}

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

因为单个 View 中的图片数量可能高达 2000 - 3000,所以我还将图片缓存到磁盘,并在图片距离超过 X 行时从 NSDictionary 中清除图片.当用户再次向下和向上滚动时,会发生以下情况:

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

当 UITableView 快要结束时,会发生以下情况:

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

所以,我遇到的问题是当我从网络服务添加新记录时。当我在 UITableView 上调用 reloadData 时,一些图像再次从磁盘加载,并且在滚动时出现一些问题。

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

因此,我主要寻找的是无限滚动 UITableView 的解决方案,它可以延迟从网络/磁盘加载图像,并且与照片应用程序一样流畅。由于图像都在单独的线程中加载,我不明白为什么滚动不如婴儿的皮肤那么光滑。

最佳答案

我不确定我是否完全理解你问题的全部内容,但以下是我在遇到类似问题时所做的一些事情。

  • 我使用 -tableView:cellForRowAtIndexPath: 作为从网络加载更多数据的提示。当 indexPath.row + 10 >= self.data.count 加载更多数据时,我选择了一个数字(在我的例子中是 10)。

    • 无论如何我都需要调用 -tableView:cellForRowAtIndexPath:
    • 我没有强制回调进入更紧密的 -scrollViewDidScroll: 循环。
  • 我将 UIImageView 子类化为一个可以异步加载图像的类,我称之为 URLImageView

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

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

  • 我使用了 -refreshData:效果非常好。
  • 我什至让 URLImageView 淡入图像。这是一个非常好的效果。

希望对您有所帮助。

关于iphone - 具有无限滚动和延迟加载的 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11273767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com