Вы должны создать два отдельных NSManagedObjectContexts
с тем же NSPersistentStoreCoordinator
, как это,
Сначала нужно создать два NSManagedObjectContexts
имя, как backgroundManagedObjectContext
и mainBackgroundManagedObjectContext
в вашем классе модели, как этот
+ (NSManagedObjectContext *)backgroundManagedObjectContext
{
static NSManagedObjectContext * backgroundManagedObjectContext;
if(backgroundManagedObjectContext != nil){
return backgroundManagedObjectContext;
}
@try {
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
backgroundManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[backgroundManagedObjectContext setPersistentStoreCoordinator: [self persistentStoreCOordinator]];
}
}
@catch (NSException *exception) {
NSLog(@"Exception occur %@",exception);
}
return backgroundManagedObjectContext;
}
, то оба должны получить тот же persistentStoreCoordinator
затем необходимо объединить backgroungManagedObjectContext
в mainBackgroundManagedObjectContext
, для этого создайте NSNotification
всякий раз, когда вы сохраняете данные в backgroundManageObjectContext
как этот
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:nil];
тогда вы должны реализовать этот способ уведомления для обновления вашего mainManagedObjectContext
как этот
- (void)contextDidSave:(NSNotification *)notification
{
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[[self mainManagedObjectContext] performSelectorOnMainThread:selector withObject:notification waitUntilDone:YES];
}
интересный вопрос, зачем вам два MOC? – DogCoffee
Насколько я понимаю, причина в том, что managedObjectContexts не являются потокобезопасными, поэтому вам нужно иметь два для каждого потока, один для простого чтения в основном потоке, а другой - для записи в фоновом потоке. Затем, когда вы закончите писать, вы объедините два, которые делают так, что вы можете выполнять большие задачи в фоновом режиме без остановки взаимодействия с пользователем. – harryisaac
я проверю его. Cheers – DogCoffee