我正在使用MagicalRecord来帮助核心数据操作。
我有一个名为NSOperation
的{{1}}子类。它从服务器检索消息并保存。
代码是这样的:
OfflineRetrieveOperation
通知接收器初始化如下:
NSManagedObjectContext *context = [NSManagedObjectContext contextForCurrentThread];
Message *existMessage = [Message MessageWithMessageID:messageID inManagedObjectContext:context];
if (!existMessage) {
Message *message = [Message insertMessageWithProperties:properties inManagedObjectContext:context];
}
[context save];
日志:
- (id)init
{
self = [super init];
if (self != nil) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:[NSManagedObjectContext defaultContext]];
[self setContext:[NSManagedObjectContext context]];
}
return self;
}
除了我根本无法收到-[NSManagedObjectContext(MagicalRecord) saveWithErrorHandler:](0x5906a0) Saving Context
-[NSManagedObjectContext(MagicalRecord) mergeChangesFromNotification:](0x37eab0) Merging changes to *** DEFAULT *** context *** on Main Thread ***
之外,一切似乎都运转良好,所以我不知道我已经完成了检索。
答案 0 :(得分:3)
您的OfflineRetrieveOperation
可能正在创建自己的NSManagedObjectContext
。保存该上下文时,它将触发NSManagedObjectContextDidSaveNotification
。但是,您有一个观察者仅会监听NSNotification
正在广播的[NSManagedObjectContext defaultContext]
。
将您的观察者更改为使用OfflineRetrieveOperation
内部NSManagedObjectContext
而不是[NSManagedObjectContext defaultContext]
的通知,并且应该开始接收通知。
答案 1 :(得分:3)
所以,我猜你可能想要在后台上下文中保存它们时更新defaultContext中的对象。当您使用辅助方法创建新上下文时,MagicalRecord实际上已经为您处理了这种情况。也就是说,当你做这样的事情时:
NSManagedObjectContext *backgroundOperationContext =
[NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThread];
上下文方法已经设置了必要的通知,以告知默认上下文在后台保存时合并更改。您需要做的就是在后台操作中保持上下文的活动状态,并在准备好保留数据时调用save。
在幕后,上下文方法正好在Marcus建议时完成,即向通知中心添加通知:
[NSNotificationCenter defaultCenter] addObserver:[NSManagedObjectContext defaultContext]
selector:...
name:NSManagedObjectContextDidSaveNotification
object:backgroundOperationContext]
这不完全是代码,但这几乎就是它的作用。
最重要的是,忘记担心自己观察和合并从背景上下文到默认上下文的变化,MagicalRecord会为你处理它。