【发布时间】:2014-05-24 17:27:23
【问题描述】:
在日历应用程序中,我根据 EventKit API 显示事件。我从EKEventStore 获取事件并以每日、每周、每月视图、列表等形式显示它们。现在我在 iPhone 4 上遇到了一些性能问题。
性能问题主要与速度有关。例如,折叠或展开所有表格视图部分(表示日期)以显示行(表示事件)需要几秒钟。为编辑/导出界面重新加载表格也需要 5-8 秒。我将不得不检查 Instruments 以提供更多详细信息。
到目前为止还没有内存问题。
我现在的策略是尽量减少内存占用。我在内存中使用数组,但它们只包含eventIdentifier,一个短字符串。我可以使用EKEventStore 方法eventWithEventIdentifier: 检索事件。我怀疑这是性能下降的原因。
我想到了两种选择:
使用
EKEvent对象而不是标识符。但是,我相信这对于内存来说是不可预测的。有些事件有很多文本,因此要保存在内存中的数据量不受限制。必须显示事件的时段的持续时间也可能非常长。将所有内容移植到 Core Data,可能会将原始
EKEvent对象存储为可转换对象。这将是一个重大的重构,但我可以利用NSFetchedResultsController及其优化功能。
我已经尝试了 1 和 2 - 性能仍然很差!
你的经验是什么?您是否看到重复调用EKEventStore 数据库时出现性能问题?你有什么建议?
更新:
Instruments 报告确实 tableView 的reloadData 需要很长时间(1.5 秒)。我不知道为什么,因为表格视图的状态(是否折叠部分)和整个数据都是在之前加载的,并且该代码是有效的。
我不计算任何单元格高度(据报道,有时这会在显示之前强制加载整个表格)。我打电话时出现同样的滞后
[tableView beginUpdates];
[tableView endUpdates];
为了动画部分的折叠。
注意:也许这个问题的主题应该改变,去掉 EventKit 部分。
【问题讨论】:
-
无论你做什么,都不要移植到 Core Data。提供的 API 在双向同步方面很糟糕。您将无法有效地听到偶数商店中的更改以更新您的 CD。
-
不正确。这是完美的工作。我只是遇到性能问题。
-
根据我的经验,最好是在后台线程上从事件存储中执行获取,一旦数据准备好,返回 UI 线程。
-
您如何聆听变化?如果你杀死了应用程序,你怎么知道哪些事件同时发生了变化?
-
您已将问题更改为说性能问题与表视图行状态的更改有关。你没有显示代码,也没有证据证明你已经测量过任何东西。您应该使用 Instruments 来衡量并找出需要时间的东西。如果修改 tableView 并更改所有行的状态,您可能做错了。担心您看不到的行的状态是没有意义的,对于适合屏幕上所有行的表格,您应该没有问题。您的展开/折叠状态不应影响 UI 性能。它可能应该被移动到模型层,所以你可以根据需要延迟加载行。
标签: ios iphone core-data eventkit ekevent