最佳实践 - iOS 中的 NSManagedObjectContextObjectsDidChangeNotification
Posted
技术标签:
【中文标题】最佳实践 - iOS 中的 NSManagedObjectContextObjectsDidChangeNotification【英文标题】:best practices - NSManagedObjectContextObjectsDidChangeNotification in iOS 【发布时间】:2011-07-20 05:54:12 【问题描述】:我正在使用 Core Data 编写我的第一个综合应用程序,我想看看跟踪各种对象更改/更新/删除的最佳方法是什么。例如,我有一个 Notes 实体和一个 Location 实体,它们之间存在一对一的关系,其想法是每个便笺都可以标记其位置。然后我有一个带有 fetchedResultsController 的 UITableView 驱动笔记列表(您可以在其中添加新笔记并为其附加日期和位置),但是我有 2 个其他视图控制器,一个带有地图视图,一个带有日历视图.地图视图获取 Location 中的所有位置并将它们显示在地图上。日历视图基本上会再次从 Notes 中获取所有数据,然后将其显示在日历视图中。 我应该如何在我的日历和地图视图中跟踪备注和位置的更改?在 viewDidLoad 中加载一次很容易,但是我应该如何跟踪所有更改,以便当用户重新访问 mapview(例如)时,他/她也能看到最新数据。
我破译的一种方法是在地图视图和日历视图中监听 NSManagedObjectContextObjectsDidChangeNotification 中的通知。每次保存时,这似乎都会从托管上下文中返回所有插入、删除和更新的对象。然后我可以浏览这些对象,看看是否需要更新我的视图。这就是我的想法:
在 MapViewController 中 viewDidLoad:
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(objectChangedNotificationReceived:)
name: NSManagedObjectContextObjectsDidChangeNotification
object: context];
然后:
- (void) objectChangedNotificationReceived: (NSNotification *) notification
NSArray* insertedObjects = [[notification userInfo]
objectForKey:NSInsertedObjectsKey] ;
NSArray* deletedObjects = [[notification userInfo]
objectForKey:NSDeletedObjectsKey] ;
NSArray* updatedObjects = [[notification userInfo]
objectForKey:NSUpdatedObjectsKey] ;
NSLog(@"insertObjects: %@", [insertedObjects description]);
NSLog(@"deletedObjects: %@", [deletedObjects description]);
NSLog(@"updatedObjects: %@", [updatedObjects description]);
for (NSManagedObject *obj in insertedObjects)
if ([obj class] == [Location class])
NSLog(@"adding a new location");
Location *locationObj = (Location *) obj;
[self.mapview addAnnotation: locationObj];
这看起来对吗?似乎有很多冗余代码要放入每个视图控制器中,特别是如果我对多个 NSManagedObject 感兴趣。我还缺少其他一些技术吗?
【问题讨论】:
NSInsertedObjectsKey 不是返回 NSSet 而不是 NSArray 吗? 【参考方案1】:NSFetchedResultsController 似乎符合您的要求。它将有效地管理来自核心数据的数据处理。您为日历视图控制器和地图视图控制器重复使用相同的获取请求。
【讨论】:
我最终还是使用了 NSFetchedResultsController,尽管我的视图没有与之关联的 tableview,而且它的工作原理就像一个魅力! @ZS 显然,NSFetchedResultsController
与 tableView 无关。【参考方案2】:
为什么不能直接从 CoreData 的 viewWillLoad 或 viewDidLoad 方法获取最新数据。这将确保您拥有最新的对象。
似乎这样会更模块化和更简洁。
【讨论】:
开销太大。为你创建一个监听变化的 FRC 是要走的路。以上是关于最佳实践 - iOS 中的 NSManagedObjectContextObjectsDidChangeNotification的主要内容,如果未能解决你的问题,请参考以下文章