【问题标题】:Improving UI performance when using Core Data使用 Core Data 时提高 UI 性能
【发布时间】:2012-08-22 14:34:37
【问题描述】:

我一直在我的项目中使用 Core Data,我一直依赖它的数据故障系统来返回缓存的数据,但是我遇到了一些性能问题,尤其是在配置其视图的 UITableView 中显示数据时基于此获取的数据。

它基本上是通过它们的唯一 ID 获取一些 NSManagedObject 实例,并总结一个存储在 NSNumber 中的值。它在 for 循环中对大约 40 个不同的对象执行此操作,并且每次重新加载 UITableView 时都会执行此操作。

是否有任何建议的方法来监听 Co​​re Data NSManagedObjects 中的更改或在我的级别缓存数据的方法,或者我应该依赖数据错误而只是我做错了什么?

如果您能给我指出一个处理这种情况的好模式,我将非常感激。

【问题讨论】:

  • 你对对象的唯一 ID 有索引吗?获取 40 个被索引的对象应该不会花费很长时间。你能把代码贴在你处理核心数据的地方吗?
  • 好的,我稍后会添加一些代码。

标签: objective-c ios cocoa-touch design-patterns core-data


【解决方案1】:

NSFetchedResultsController 提供了一个很好的机制来处理错误并为 UITableView 提供一个干净的接口。使用 Instruments 和 Time Profiler 可以很好地了解您的性能问题具体在哪里。

【讨论】:

    【解决方案2】:

    您可以直接使用 Core Data 检索属性的总和。阅读标题为Fetching Specific Values 的部分。

    这应该是您需要的唯一提示:

    NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"Count"];
    NSExpression *sumOfCountExpression = [NSExpression expressionForFunction:@"sum:"
                                              arguments:[NSArray arrayWithObject:keyPathExpression]];
    

    这不应该太慢而导致问题,除非您重新加载表的次数过多。

    【讨论】:

      【解决方案3】:

      您需要做的第一件事是使用 NSFetchedResultsController。它可以与 UITableview 一起使用,并且非常适合您在此处尝试完成的工作。第二件事,将 fetchBatchSize 分配给您的 fetch 请求。您不需要将所有记录保存在内存中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 2020-02-06
        • 2018-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多