Z S*_*Z S 10 core-data objective-c nsmanagedobject nsmanagedobjectcontext
我正在使用Core Data编写我的第一个综合应用程序,我想看看跟踪各种对象更改/更新/删除的最佳方法是什么.例如,我有一个Notes实体和一个Location实体,以及它们之间的一对一关系,这个想法是每个音符都可以标记其位置.然后我有一个带有fetchedResultsController的UITableView驱动笔记列表(你可以添加新笔记并在其中附加日期和位置),但是我有2个其他视图控制器,一个带有地图视图,另一个带有日历视图.地图视图将获取位置中的所有位置并将其显示在地图上.日历视图基本上再次从Notes获取所有数据,并在日历视图中显示它.如何在日历和地图视图中跟踪Notes和Location的更改?在viewDidLoad中很容易将它们加载一次,但是我应该如何跟踪所有更改,以便当用户重新访问mapview时(例如)他/她也会看到最新数据.
我解读的一种方法是在地图视图和日历视图中监听NSManagedObjectContextObjectsDidChangeNotification中的通知.这似乎从托管上下文返回所有插入,删除和更新的对象,每次都有保存.然后我可以浏览这些对象,看看是否需要更新我的视图.这就是我在考虑这样做的方式:
在MapViewController viewDidLoad中:
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(objectChangedNotificationReceived:)
name: NSManagedObjectContextObjectsDidChangeNotification
object: context];
Run Code Online (Sandbox Code Playgroud)
然后:
- (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];
}
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来是对的吗?看起来很多冗余代码都放在每个视图控制器中,特别是如果我对多个NSManagedObject感兴趣的话.还有其他一些我缺少的技术吗?