【发布时间】:2016-04-15 07:56:36
【问题描述】:
事实:
- 我使用 CoreData。
- 我有带有子行的父对象,其中子对象可能超过 500 个。
- 我在
UITableViewControllerUITableView中显示那些子对象。 - 我已将其设置为与
NSFetchedResultsController一起使用,这样我就可以在发生变化时立即获得更新。我需要那个。 -
我正在使用以下代码合并从私有上下文到主上下文的更改:
@objc func privateContextDidSaveNotification(notification: NSNotification) { let savedContext = notification.object as! NSManagedObjectContext if savedContext == self.managedObjectContext { return // This is the Main context } if savedContext.persistentStoreCoordinator != self.managedObjectContext.persistentStoreCoordinator { return // This is different DB } self.managedObjectContext.performBlockAndWait( { self.managedObjectContext.mergeChangesFromContextDidSaveNotification(notification) self.managedObjectContext.refreshAllObjects() }) } -
NSFetchedResultsController.delegate仅设置在子对象上。
问题:
即使此父对象的一个子对象发生更改,
func controller(controller: NSFetchedResultsController,
didChangeObject anObject: AnyObject,
atIndexPath indexPath: NSIndexPath?,
forChangeType type: NSFetchedResultsChangeType,
newIndexPath: NSIndexPath?) 也会为所有子行调用,这意味着它被调用 >500 次,基本上,应用程序会冻结。
我的发现:
- 合并后所有子对象的更新通知是由以下行引起的:
self.managedObjectContext.refreshAllObjects()。 - 如果我删除该行,那么
NSFetchedResultsController将不会收到任何通知,告知其内容已更新 - 但我需要。
问题:
- 我怎样才能使某一行发生更改的子对象,意思是 - 我怎样才能通知
NSFetchedResultsController仅实际更改的行? - 通知 NSFetchedResultsController 合并对象的典型解决方案是什么?
非常感谢!
马里斯
【问题讨论】:
标签: ios uitableview core-data nsfetchedresultscontroller nsmanagedobjectcontext