【问题标题】:How does one have a Singleton Observe Changes to Core Data Model?单例如何观察核心数据模型的变化?
【发布时间】:2012-07-17 09:04:13
【问题描述】:

如何使用单例对象观察 CoreData 的变化?

在我的应用程序中,每次用户添加新的 CoreData FoodEntry 时,我都想通知我的单身人士,它将总结当天的卡路里总量,然后我的 ViewController 将收到当天的卡路里总量发生变化的通知,它可以更新用户界面。所以 Singleton 正在观察 CoreData 上下文,而 viewController 正在观察 Singleton number cruncher 类。

到目前为止,我的计划是实现单例并让它订阅 NSManagedObjectContextObjectsDidChangeNotification,然后在回调方法 handleDataModelChange 中处理数字...我遇到两个错误

CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获到异常。这通常是NSManagedObjectContextObjectsDidChangeNotification 的观察者中的错误。

+[FitWrench handleDataModelChange:]: 无法识别的选择器发送到类 0x27a58

我设置了一个异常断点,当我保存 managedObjectContext 但我无法让它打印出 userInfo...=(

@implementation Singleton

+ (Singleton *) sharedInstance
{
    static Singleton *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[Singleton alloc] init];

        // Do any other initialisation stuff here
        AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
        NSManagedObjectContext *myManagedObjectContext = appDelegate.managedObjectContext;

        [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(handleDataModelChange:) 
                                    name:NSManagedObjectContextObjectsDidChangeNotification 
                                                   object:myManagedObjectContext];

    });
    return sharedInstance;
}

- (void)handleDataModelChange:(NSNotification *)note;
{
    NSSet *updatedObjects = [[note userInfo] objectForKey:NSUpdatedObjectsKey];
    NSSet *deletedObjects = [[note userInfo] objectForKey:NSDeletedObjectsKey];
    NSSet *insertedObjects = [[note userInfo] objectForKey:NSInsertedObjectsKey];

    // Do something in response to this
    NSLog(@"%@ Objects Updated, %@ Objects Deleted, %@ Objects Inserted",[updatedObjects count],[deletedObjects count],[insertedObjects count]);
}

@end

【问题讨论】:

  • 我不建议这样做。我从来不需要单例来观察 CoreData 上下文的变化。查看您的示例,我看到您计划对所有内容使用单个托管对象上下文,这使您创建可能不一致/无效的对象更加麻烦。订阅负责管理核心数据托管对象的视图控制器中的上下文更改。

标签: ios


【解决方案1】:

这行末尾是一个流氓分号吗...?

- (void)handleDataModelChange:(NSNotification *)note;

【讨论】:

    【解决方案2】:

    很惊讶这里没有出现编译错误。NSLog(@"%@ Objects Updated, %@ Objects

    Deleted, %@ Objects Inserted",[updatedObjects count],[deletedObjects count],[insertedObjects count]);
    

    第一个占位符是一个对象,但 [deletedObjects count] 返回一个 NSUInteger。 %i 可能会更好。

    【讨论】:

    • 你是对的,谢谢...虽然语法不是问题...目前这是一个混乱的问题...
    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多