【问题标题】:I need to optimize UITableViewCell image loading我需要优化 UITableViewCell 图像加载
【发布时间】:2012-05-28 17:07:47
【问题描述】:

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

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

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

【问题讨论】:

  • 你将不得不发布更多的代码!!
  • 您发布的代码似乎没有意义。

标签: ios uitableview image-loading


【解决方案1】:

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

【讨论】:

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

    【讨论】:

      【解决方案3】:

      使用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。

      【讨论】:

        【解决方案4】:

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

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

        祝你好运!

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-09
            • 2013-02-13
            • 2013-08-04
            • 1970-01-01
            相关资源
            最近更新 更多