Поскольку для базовых данных требуется один контекст управляемого объекта на поток, возможным решением было бы отслеживать контекст для каждого потока в глобальном менеджере, а затем отслеживать уведомления о сохранении и распространять на все потоки:
Предполагая:
@property (nonatomic, strong) NSDictionary* threadsDictionary;
Вот как получить управляемый объект (для потока):
- (NSManagedObjectContext *) managedObjectContextForThread {
// Per thread, give one back
NSString* threadName = [NSString stringWithFormat:@"%d",[NSThread currentThread].hash];
NSManagedObjectContext * existingContext = [self.threadsDictionary objectForKey:threadName];
if (existingContext==nil){
existingContext = [[NSManagedObjectContext alloc] init];
[existingContext setPersistentStoreCoordinator: [self persistentStoreCoordinator]];
[self.threadsDictionary setValue:existingContext forKey:threadName];
}
return existingContext;
}
В какой-то момент в методе init вашего глобального менеджера (я использовалsingleton):
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backgroundContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:nil];
Затем, чтобы получать уведомления о сохранении и распространяться на все другие объекты управляемого контекста:
- (void)backgroundContextDidSave:(NSNotification *)notification {
/* Make sure we're on the main thread when updating the main context */
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(backgroundContextDidSave:)
withObject:notification
waitUntilDone:NO];
return;
}
/* merge in the changes to the main context */
for (NSManagedObjectContext* context in [self.threadsDictionary allValues]){
[context mergeChangesFromContextDidSaveNotification:notification];
}
}
(некоторые другие методы были удалены для ясности)