Objective c 最佳实践-iOS中的NSManagedObjectContextObjectsIDChangeNotification

Objective c 最佳实践-iOS中的NSManagedObjectContextObjectsIDChangeNotification,objective-c,core-data,nsmanagedobject,nsmanagedobjectcontext,Objective C,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,我正在使用核心数据编写我的第一个综合应用程序,我想看看跟踪各种对象更改/更新/删除的最佳方法是什么。例如,我有一个Notes实体和一个Location实体,它们之间有一对一的关系,即每个Notes都可以标记其位置。然后,我有一个UITableView,其中一个fetchedResultsController驱动注释列表(您可以在其中添加新注释并将日期和位置附加到注释列表),但我还有另外两个视图控制器,一个具有地图视图,另一个具有日历视图。地图视图获取Location中的所有位置,并将它们显示在地

我正在使用核心数据编写我的第一个综合应用程序,我想看看跟踪各种对象更改/更新/删除的最佳方法是什么。例如,我有一个Notes实体和一个Location实体,它们之间有一对一的关系,即每个Notes都可以标记其位置。然后,我有一个UITableView,其中一个fetchedResultsController驱动注释列表(您可以在其中添加新注释并将日期和位置附加到注释列表),但我还有另外两个视图控制器,一个具有地图视图,另一个具有日历视图。地图视图获取Location中的所有位置,并将它们显示在地图上。日历视图基本上再次从Notes获取所有数据,并在日历视图中显示。 我应该如何在日历和地图视图中跟踪注释和位置的更改?在viewDidLoad中加载一次很容易,但是我应该如何跟踪所有更改,以便用户在重新访问地图视图时(例如)也能看到最新的数据

我解释的一种方法是在“地图”视图和“日历”视图中的NSManagedObjectContextObjectsIDChangeNotification中侦听通知。每次保存时,似乎都会返回托管上下文中所有插入、删除和更新的对象。然后我可以浏览这些对象,看看是否需要更新视图。我就是这么想的:

在MapViewController viewDidLoad中:

[[NSNotificationCenter defaultCenter]
    addObserver: self
    selector: @selector(objectChangedNotificationReceived:)
    name: NSManagedObjectContextObjectsDidChangeNotification
    object: context];
然后:


这似乎是正确的吗?似乎每个视图控制器中都有很多冗余代码,特别是如果我对多个NSManagedObject感兴趣的话。我还缺少其他一些技巧吗

为什么不能直接从viewWillLoad或viewDidLoad方法上的CoreData获取最新数据呢。这将确保您拥有最新的对象


看起来这将更加模块化和干净。

似乎符合您的要求。它将有效地管理来自核心数据的数据处理。您可以对日历视图控制器和地图视图控制器重复使用相同的获取请求。

我最终使用了NSFetchedResultsController,尽管我的视图没有与之关联的tableview,而且它工作起来很有魅力@ZS显然,
NSFetchedResultsController
与tableView没有关联。开销太大。创建一个能监听您的更改的FRC是一个好办法。NSInsertedObjectsKey不是返回NSSet而不是NSArray吗?
- (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];
        }
    }
}