【发布时间】:2011-07-18 06:38:29
【问题描述】:
首先,我通过下面粘贴的链接找到了几个与该问题相关的问题,但没有一个真正帮助我解决问题:
iPhone CoreData properties: changes to managedObjects are too slow
iOS CoreData: NSFetchedResultsController performances
我有一个包含大约 5,000 行的 tableview,当前由 fetched results controller 管理。
每一行显示文档实体的基本属性,还包括一个按钮,供用户将特定文档标记为收藏夹。诚然,Document 实体与几个不同的实体有关系,并且底层 SQLite 数据库很大(~20mb)。
获取每一行的属性相对较快,并且表格视图在处理这么多项目时表现得非常好。保存更改也不是问题。
当我尝试更改我的 Document 实体的 isFavourite (BOOL) 属性时,我的问题出现了。此属性在按钮修饰内部事件中设置/更新:
[document setIsFavourite:[NSNumber numberWithBool:![document isFavourite]]]
这里的问题是,每次点击收藏按钮时,这行特定的代码都会阻塞 UI 约 1-2 秒,这显然并不理想。
我尝试将 isFavourite 属性标记为索引,并增加了 fetch 批量大小,最后为 NSFetchedResultsController 创建了一个缓存,但似乎对性能没有任何帮助。
我设法避免 UI 锁定的唯一方法是在后台线程上执行属性设置,但这涉及创建新上下文、注册通知以及在保存上下文时合并更改。在这种情况下,会出现另一个问题,因为当我使用合并更改响应保存通知时,我获取的结果控制器似乎很困惑,并且更改的行会自动从我的 tableview 中删除,唯一的方法是做一个 [tableview reloadData]。
有没有其他人遇到过类似的问题,还有什么我可以尝试解决的吗?
非常感谢,
罗格
【问题讨论】:
-
您如何确认该特定行导致挂起?
-
仪器是你的朋友。如果那条线真的是违规者,我会使用仪器来查看是什么 kvo 观察者导致你停滞不前。
-
@ImHuntingWabbits 我试过仪器,但由于某种原因它不允许我在 iOS 上运行任何核心数据模板(它说它不兼容)。有没有其他办法?
-
您不需要运行任何一个 CoreData 模板,只需使用时间分析器查看 UI 响应点击后导致您速度变慢的原因。
标签: ios core-data nsfetchedresultscontroller nsmanagedobject