-(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:
后很快就会删除观察者吗?
答案 0 :(得分:1)
只要您收到了所需的通知,就不会太早。但是该代码还存在其他问题。
添加观察者,触发通知,然后删除观察者没有任何意义。您也可以直接调用handleSaveNotification
方法,而不是烦恼通知。用较少的工作会产生同样的效果。
原因是通知在其发布的帖子上同步传递。因此,如果someBackgroundTask
实际上在后台线程或队列上运行,handleSaveNotification
也将在后台运行。使用这样的通知并不能让你跨线程。要在主线程上进行合并,您有几个选项,包括:
addObserverForName:object:queue:usingBlock:
注册通知。使用该方法,您可以告知通知中心使用哪个队列。确保保存对此方法返回的对象的引用 - 稍后您将需要它来删除观察者。dispatch_async
或performSelectorOnMainThread:withObject:waitUntilDone:
将合并移动到主线程。