我目前正在开发一个核心数据应用程序。我有一个表格 View ,它显示了一个项目列表,其属性 scheduled (这是一个日期)是 nil 并且 BOOL 属性是 没有 。每个表格 View 单元格中都有一个按钮,允许用户在模态视图中设置日期。模态视图中有一个日期选择器。该项目被传递给该模态视图 Controller 。
当用户在模态视图中点击完成按钮时设置日期。日期是用这行代码设置的:
self.item.scheduled = self.datePicker.date;
显然,这行代码会导致 UI 被阻止约 1 秒(在第 5 代 iPod touch 上),这是不受欢迎的行为。我使用 Instruments 发现 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] 占用了 900.0ms 以上。
有人可以告诉我是什么导致缓慢吗?我目前只使用一个 MOC。我应该使用另一个来进行更改吗?
编辑: 我从 Instruments 获得的耗时最长的方法告诉我,表格 View Controller 似乎试图重新获取或更新单元格,导致运行缓慢。我在启动时传递了 -com.apple.CoreData.SQLDebug 1 ,但是在设置日期时没有显示任何消息。
这是我从 Instruments 获得的调用树。
CoreDataTableViewController 摘 self 读过的一本关于 Core Data 的书。它与找到的 here 基本相同.
Best Answer-推荐答案 strong>
我终于 found the answer .事实证明,离屏时自动布局非常慢。这就是为什么在调用树中可以看到布局操作花费了大部分时间的原因。
我选择的解决方案是在 viewWillDisappear: 中删除 TableView Controller 作为 NSFetchedResultsController 的委托(delegate)。然后,在 viewWillAppear: 中,我对 table view 执行重新获取并调用 reloadData ,并设置 NSFetchedResultsController 的 将 属性委托(delegate)给self (即表格 View Controller )。
编辑:正如评论中提到的 amb,上面的解决方案是一个不好的方法。这是better approach .我应该补充一点,我的表格 View 只有在我添加时才正确重新加载
if(self.tableView.window == nil)
return;
同样适用于 controllerWillChangeContent: 。
关于ios - 将 NSDate 设置为 NSManagedObject 很慢?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/24347791/
|