CoreData:在save:call之后立即删除'didSave'通知。太快了?

时间:2013-08-28 23:05:16

标签: ios core-data nsnotificationcenter nsnotification

-(void)someBackgroundTask {
   NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
   [context setPersistentStoreCoordinator:[self coordinator]];

   // ...

   NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
   [notificationCenter addObserver:self selector:@selector(handleSaveNotification:) name:NSManagedObjectContextDidSaveNotification object:context];

   [context save:&error];

   // safe?
   [notificationCenter removeObserver:self name:NSManagedObjectContextDidSaveNotification object:context];

   // ...
}


// meanwhile on the main thread...
-(void)handleSaveNotification:(NSNotification *)notification {
   [[self context] mergeChangesFromContextDidSaveNotification:notification];
}

调用save:后很快就会删除观察者吗?

1 个答案:

答案 0 :(得分:1)

只要您收到了所需的通知,就不会太早。但是该代码还存在其他问题。

添加观察者,触发通知,然后删除观察者没有任何意义。您也可以直接调用handleSaveNotification方法,而不是烦恼通知。用较少的工作会产生同样的效果。

原因是通知在其发布的帖子上同步传递。因此,如果someBackgroundTask实际上在后台线程或队列上运行,handleSaveNotification也将在后台运行。使用这样的通知并不能让你跨线程。要在主线程上进行合并,您有几个选项,包括:

  • 使用addObserverForName:object:queue:usingBlock:注册通知。使用该方法,您可以告知通知中心使用哪个队列。确保保存对此方法返回的对象的引用 - 稍后您将需要它来删除观察者。
  • 直接调用merge方法,但在该方法中使用dispatch_asyncperformSelectorOnMainThread:withObject:waitUntilDone:将合并移动到主线程。