我目前正在开发核心数据应用程序。我有一个表格视图,其中显示了属性scheduled
(日期)为nil
且BOOL
属性为NO
的项目列表。每个表格视图单元格中都有一个按钮,允许用户在模态视图中设置日期。模态视图中有一个日期选择器。该项目将传递给该模态视图控制器。
当用户点击模态视图中的“完成”按钮时,会设置日期。使用以下代码行设置日期:
self.item.scheduled = self.datePicker.date;
显然,这行代码会导致UI被阻止约1秒钟(在第5代iPod touch上),这是不受欢迎的行为。我使用了Instruments并发现-[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:]
占用了900.0ms。
有人可以告诉我导致这种缓慢的原因吗?我目前只使用一个MOC。我应该用另一个来做出改变吗?
编辑:我从Instruments获得最长时间的方法告诉我,表视图控制器似乎试图重新获取或更新单元格,从而导致速度变慢。我虽然已经在{}发送了-com.apple.CoreData.SQLDebug 1
,但是在设置日期时没有显示任何消息。
这是我从乐器获得的调用树。
CoreDataTableViewController
摘自我读过的关于核心数据的书。它与发现的here大致相同。
答案 0 :(得分:2)
我终于found the answer了。事实证明,在屏幕外时,自动布局非常慢。这就是为什么在调用树中可以看到布局操作花费大部分时间的原因。
我选择的解决方案是将表视图控制器删除为 NSFetchedResultsController
中viewWillDisappear:
的委托。然后,在viewWillAppear:
中,我执行重新获取并在表格视图上调用reloadData
,并将NSFetchedResultsController
的{{1}}属性设置回delegate
(这是表视图控制器)。
编辑:正如评论中提到的那样,上面的解决方案是一种糟糕的方法。这是better approach。我应该补充一点,我添加
时我的表视图只能正确重新加载self
也是if(self.tableView.window == nil)
return;
。