最佳实践 - iOS中的NSManagedObjectContextObjectsDidChangeNotification

时间:2011-07-20 05:54:13

标签: objective-c core-data 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];

然后:

- (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感兴趣的话。还有其他一些我缺少的技术吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

似乎更模块化,更清洁。