【问题标题】:Should there be a UITableView performance difference between NSFetchedResultsController and executeFetchRequest?NSFetchedResultsController 和 executeFetchRequest 之间是否应该存在 UITableView 性能差异?
【发布时间】:2012-08-20 22:09:11
【问题描述】:

我有一个 iPad 应用程序,它由 Core Date 支持并在 UITableView 中显示数据。我还使用自定义单元格来为每个单元格显示多个 ULabel。

它工作正常,但是当向 tableView 添加大量项目时,它会陷入困境并且感觉有点迟钝。我目前没有使用 NSFetchedResultsController。每当对数据进行更改时,都会像这样刷新 ivar 数组的数据:

items = [self.managedObjectContext executeFetchRequest:allItems error:&error];

Items 是 tableView 从中提取所有数据的数组,所有内容都会更新并正常工作。但是速度不是特别快!我的方法有问题吗? NSFetchedResultsController 是唯一的出路吗?委托/数据源方法中正在进行的处理并不那么繁重。基本上是从数组中取出值并将它们设置为 UILabels。

一切都按照我现在需要的方式进行,我只需要它响应更快。

谢谢

【问题讨论】:

  • 使用工具分析您的应用程序,并在进行任何更改之前找出花费的时间。绘图与获取核心数据一样容易。
  • 同意 jrturton,尽管您也可以只输入一些常量,或者在所有行中始终使用相同的项目而不需要提取 - 看看这是否与它有关跨度>

标签: iphone ios uitableview core-data datasource


【解决方案1】:

使用乐器。总是。永远。

很可能,您至少需要模仿 FRC 所做的一些批处理和前瞻性思考。但是,您可能会发现您总是在访问关系,并且预取它们可能会解决您的问题。

一切都是纯粹的推测,没有硬、冷、数字……您可以从 Instruments 轻松获得。

编辑

单元格绘图可能会减慢您的速度。但是,这对于较少数量的对象也是可以观察到的。如果您的数据与其他单元格有显着差异,您通常只会看到由于绘图而导致性能下降。

现在,当然,假设您正在使用单元重用。如果你不重复使用你的细胞,那么所有的赌注都没有了。但是,使用单元重用时,您通常不会看到与对象数量相关的性能。

再次,运行仪器。这是了解您的问题所在的唯一方法。其他的都是浪费时间。

【讨论】:

    【解决方案2】:

    NSFetchedResultsController 绝对是强烈推荐的。它不仅可以潜在地解决您的性能问题,还可以带来各种便利的设施(例如委托协议)和幕后优化。

    这些优化中最重要的可能是内存管理。您的解决方案(包含数组中的所有项目)似乎是一个糟糕的设计选择,不会扩展到大量的记录/行。

    话虽如此,在绘制单元格时使用通常的优化策略:

    • 尽量减少标签和其他子视图的使用;
    • 不要使用透明背景;
    • 不要使用 1.0 以外的 alpha;
    • 单元格中没有子视图重叠等。

    如果性能仍然是一个问题,您将不得不通过覆盖 UITableViewCell 子类的 drawRect 自己绘制内容。

    【讨论】:

    • 我认为你已经解决了我的一些问题。为什么数组方法不能扩展?每个单元格当前都添加了 4 个 UILabel 作为子视图,我在那里可以做些什么不同的事情?如果您能帮助我确定最有帮助的更好方法。谢谢!
    • 当阵列必须容纳超过 40 个单元时,内存将成为问题。 NSFetchedResultsController 只在内存中保留 10 行左右,并最大限度地减少到持久存储的行程。
    • 一个单元格中的 4 个标签很多。您可以使用 NSString 的drawAtPoint(用于drawRect 自己编写标签。闪电快!
    猜你喜欢
    • 2012-03-05
    • 2014-05-17
    • 2012-08-21
    • 2023-03-15
    • 2014-02-23
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多