Вот что вам нужно сделать, чтобы правильно объединить контексты.
Во-первых, вам не нужно ваше собственное уведомление. Выполнение операции сохранения в контексте автоматически направляет следующее уведомление зарегистрированным наблюдателям:
NSManagedObjectContextDidSaveNotification
Поэтому все, что вам нужно сделать, это:
1) в вашей основной теме, может быть в методе viewDidLoad
, зарегистрируйтесь для этого уведомления:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:nil];
2) реализовать метод contextDidSave:
в вашем основном потоке следующим образом:
- (void)contextDidSave:(NSNotification *)notification
{
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[managedObjectContext performSelectorOnMainThread:selector withObject:notification waitUntilDone:YES];
}
3) в вашем методе dealloc
добавьте следующее:
[[NSNotificationCenter defaultCenter] removeObserver:self];
4) создайте новый контекст в другом потоке, используя что-то вроде следующего метода:
- (NSManagedObjectContext*)createNewManagedObjectContext
{
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
[moc setUndoManager:nil];
return [moc autorelease];
}
5) после получения новых данных правильным способом решения этой ситуации является использование идентификаторов управляемых объектов. Поскольку идентификаторы управляемых объектов являются поточно-ориентированными, вы можете передавать их из основного потока в другой поток, а затем использовать existingObjectWithID:error:
, чтобы получить объект, связанный с конкретным идентификатором, обновить его и сохранить контекст. Теперь слияние будет работать так, как вы ожидаете. В качестве альтернативы, если вы заранее не знаете, какие идентификаторы управляемых объектов должны передаваться между потоками, то в другом потоке вы просто выбираете объекты, используя предикат для извлечения объектов, соответствующих объектам, полученным с сервера, а затем обновляете их. и сохраните контекст.