最佳实践 - 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的主要内容,如果未能解决你的问题,请参考以下文章

iOS - FileManager 扩展的最佳实践

iOS 测试推送通知的最佳实践(UI 测试)

iOS ViewController 生命周期最佳实践 [关闭]

避免登录按钮的 Facebook 和 iOS 集成最佳实践

最佳实践,包括 Grails 中的 Angular UI

iOS 5 最佳实践(发布/保留?)