【发布时间】: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