将NSDate设置为NSManagedObject会变慢吗?

时间:2014-06-22 03:08:35

标签: ios objective-c core-data

我目前正在开发核心数据应用程序。我有一个表格视图,其中显示了属性scheduled(日期)为nilBOOL属性为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,但是在设置日期时没有显示任何消息。

这是我从乐器获得的调用树。

Call tree

CoreDataTableViewController摘自我读过的关于核心数据的书。它与发现的here大致相同。

1 个答案:

答案 0 :(得分:2)

我终于found the answer了。事实证明,在屏幕外时,自动布局非常慢。这就是为什么在调用树中可以看到布局操作花费大部分时间的原因。

我选择的解决方案是将表视图控制器删除为NSFetchedResultsControllerviewWillDisappear:的委托。然后,在viewWillAppear:中,我执行重新获取并在表格视图上调用reloadData,并将NSFetchedResultsController的{​​{1}}属性设置回delegate (这是表视图控制器)。

编辑:正如评论中提到的那样,上面的解决方案是一种糟糕的方法。这是better approach。我应该补充一点,我添加

时我的表视图只能正确重新加载
self

也是if(self.tableView.window == nil) return;