在NSOperation子类中保存上下文时,无法接收NSManagedObjectContextDidSaveNotification

时间:2011-10-25 02:12:14

标签: core-data notifications nsoperation

我正在使用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 *** 之外,一切似乎都运转良好,所以我不知道我已经完成了检索。

2 个答案:

答案 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会为你处理它。