Не удается получить NSManagedObjectContextDidSaveNotification при сохранении контекста в подклассе NSOperation - PullRequest
1 голос
/ 25 октября 2011

Я использую MagicalRecord , чтобы помочь с операцией с основными данными.

У меня есть NSOperation подкласс, называемый 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 ***

Кажется, все работает нормально, кроме меняя не могу получить NSManagedObjectContextDidSaveNotification вообще, так что я не могу знать, что я уже закончил извлечение.

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

Итак, я предполагаю, что вы, вероятно, захотите обновить объекты в defaultContext, когда вы сохраните их в фоновом контексте.MagicalRecord фактически уже обрабатывает этот случай для вас, когда вы создаете новый контекст, используя вспомогательный метод.То есть, когда вы делаете что-то вроде этого:

NSManagedObjectContext *backgroundOperationContext = 
          [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThread];

Метод контекста уже настроил уведомления, необходимые, чтобы сообщить контексту по умолчанию для объединения изменений, когда он сохраняется в фоновом режиме.Все, что вам нужно сделать, это сохранить ваш контекст в фоновой операции и вызвать save, когда вы будете готовы сохранить данные.

За кулисами метод контекста делает именно то, что предлагает Маркус, и это, добавив уведомление в центр уведомлений:

[NSNotificationCenter defaultCenter] addObserver:[NSManagedObjectContext defaultContext]        
                                        selector:... 
                                            name:NSManagedObjectContextDidSaveNotification 
                                          object:backgroundOperationContext]

Это не совсем код, но это в значительной степени то, что он делает.

Итог, не беспокойтесь о наблюдении и слиянииMagicalRecord позаботится об этом самостоятельно, перейдя из фонового контекста в контекст по умолчанию.

3 голосов
/ 26 октября 2011

Ваш OfflineRetrieveOperation, вероятно, создает свой собственный NSManagedObjectContext. Когда вы сохраняете этот контекст, он запускает NSManagedObjectContextDidSaveNotification. Однако у вас есть наблюдатель, который будет только прослушивать NSNotification, передаваемый [NSManagedObjectContext defaultContext].

Измените своего наблюдателя на получение уведомлений от вашего OfflineRetrieveOperation внутреннего NSManagedObjectContext вместо [NSManagedObjectContext defaultContext], и он должен начать их получать.

...