如何使用Singleton观察核心数据模型的变化?

时间:2012-07-17 09:04:14

标签: ios

如何使用Singleton对象观察对CoreData的更改?

在我的应用程序中,每当用户添加新的CoreData FoodEntry时,我想通知我的Singleton,它将总结当天的卡路里总数,然后我的ViewController将被通知当天的卡路里总数已经改变,它可以更新UI。所以Singleton正在观察CoreData上下文,viewController正在观察Singleton数字cruncher类。

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

CoreData:错误:严重的应用程序错误。在Core Data更改处理期间捕获到异常。这通常是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

2 个答案:

答案 0 :(得分:0)

在这一行的最后是一个流氓分号......?

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

答案 1 :(得分:0)

很惊讶你在这里没有得到编译错误.NSLog(@“%@ Objects Updated,%@ Objects

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

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