我需要优化UITableViewCell图像加载

时间:2012-05-28 17:07:47

标签: ios uitableview image-loading

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

我有一个图像加载器类。我把字典传递给ImageLoader的方法。由图像URL和其他一些信息组成的字典。当我们慢慢向下滚动UITableView时,此代码很有效。但是如果我们快速向下滚动它会有一些滞后。我需要优化我的算法。任何想法。

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

5 个答案:

答案 0 :(得分:1)

我相信this tutorial会有助于回答您的问题。它涵盖了您无法顺利滚动以及如何解决问题的原因。

答案 1 :(得分:0)

  • 禁用图像加载并测试表行为 - 问题可能是缓慢的单元格初始化,如果自定义单元格drawRect被覆盖,请注意此方法,因为文档说它是海军使用会大大减慢动画效果,找到优化绘图的方法。
  • 如果表格在禁用图像加载的情况下顺利滚动,请考虑限制并发加载操作的数量(稍后加载待处理的操作)并在可用时使用缓存。

答案 2 :(得分: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。

答案 3 :(得分:0)

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

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

祝你好运!

答案 4 :(得分:0)

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