-1

我有一个自定义 UITableViewCell。每个单元格都有一个独特的图像。

我有一个图像加载器类。我将字典传递给 ImageLoader 的方法。由图像 url 和一些其他信息组成的字典。当我们慢慢向下滚动 UITableView 时,这段代码运行良好。但是,如果我们快速向下滚动,它将有一些滞后。我需要优化我的算法。有任何想法吗。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
  [ImageLoader addImageToQueue:dictionary];
}
4

5 回答 5

1

我相信本教程将有助于回答您的问题。它涵盖了您无法平滑滚动的原因以及如何修复它。

于 2012-05-30T15:29:28.057 回答
0
  • 禁用图像加载并测试表格行为 - 问题可能是单元格初始化缓慢,如果自定义单元格drawRect被覆盖,请特别注意此方法,因为文档说它的海军使用会显着减慢动画,找到优化的方法绘画。
  • 如果表格在禁用图像加载的情况下平滑滚动,请考虑限制并发加载操作的数量(稍后加载挂起的操作)并在可用时使用缓存。
于 2012-05-28T17:36:03.050 回答
0

使用UITableView dequeueReusableCellWithIdentifier:

这基本上意味着您不必每次都从头开始重新创建表格单元格。如果你给一个单元格一个重用标识符,它会在内存中保留那个单元格,并在你请求一个匹配那个标识符的单元格时让你出列它。

由于每个单元格都有一个唯一的图像,因此您最好将每个单元格的唯一标识符设置为图像中的某些内容 - 也许是图像的 URL 或文件名。这将比处理和重新创建单元格消耗更多的内存,但它会减少滚动延迟,如果您的图像很小,那么内存占用量就不会那么大。

你最终可能会得到类似的东西:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    NSString *imageURL = urlOfImageForThisCell;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:imageURL];
    if(!cell)
    {
        cell = [self makeNewCell];
        //if your reuseIdentifier is unique to each image, you only ever need to set it's image here
        cell.image = imageForThisCell;

        cell.reuseIdentifier = imageURL;
    }

    //additional cell setup here

    return cell;
}

您还需要查看子类化 UITableViewCell 和覆盖 prepareForReuse。

于 2012-05-28T17:39:58.737 回答
0

我会在这里查看 Ray Wenderlich 关于多线程和 GCD 的教程。

没有看到你的cellForRowAtIndexPath:ImageLoader代码很难,但我怀疑你的 ImageLoader 正在减慢速度,以至于它必须等待它完成才能提供单元格。即使只是从磁盘读取图像,也应该在后台线程上异步完成,以便主线程可以专注于平滑滚动。

祝你好运!

于 2012-05-28T18:10:38.700 回答
0

我知道这是旧的,但我推荐这篇文章: http ://www.nsprogrammer.com/2013/10/easy-uitableview-buffering.html

于 2013-11-15T18:15:56.000 回答