我正在iPhone SDK 3.1.3上尝试多线程Core Data实现。我为每个线程有两个不同的NSManagedObjectContext对象,我正在一个线程上注册更改通知,如下所示:
- (void)setup {
DLog(@"Registering for NSManagedObjectContext notifications");
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(test:) name:@"NSManagedObjectContextWillSaveNotification" object:nil];
[nc addObserver:self selector:@selector(test:) name:@"NSManagedObjectContextDidSaveNotification" object:nil];
[nc addObserver:self selector:@selector(test:) name:@"NSManagedObjectContextObjectsDidChangeNotification" object:nil];
}
- (void)test:(NSNotification *)notif {
DLog(@"Test callback");
}
在我的另一个帖子中,我正在保存第二个上下文:
NSError *error = nil;
[managedObjectContext save:&error];
if (error) {
ALog(@"Error occured while trying to save a NewsStory object");
}
else {
DLog(@"Saving context");
}
通知回调方法永远不会执行,这让我相信这些通知永远不会发布?
我的日志显示以下内容:
Registering for NSManagedObjectContext notifications
Saving context
...
Saving context
答案 0 :(得分:14)
将您的@"NSManagedObjectContextWillSaveNotification"
切换为NSManagedObjectContextWillSaveNotification
。那些是常数。这些事件最有可能被发布,但你没有听到正确的名字。
答案 1 :(得分:0)
我知道的一件事会导致通知出现问题,而Core Data正在拥有一个自定义的托管对象子类,它不能正确地遵守键值观察。这可以防止首先创建更改通知。
作为一个测试,我建议在同一个线程中注册一个观察者,或者甚至让子类(如果你使用它们)注册观察自己。如果这不起作用那么你的问题比通知更基本。如果它确实有效,那么你的问题在于线程。