У меня возникла проблема, связанная с моей основной обработкой данных и потоками. Он отлично работает на iOS 7, но я не могу заставить основной контекст правильно обновляться на iOS 6.Резьба для CoreData. iOS 6 vs 7
У меня есть два NSPsistentStoreCoordinators, указывающие на тот же файл базы данных. Затем у меня есть основной контекст и фоновой контекст. Все новые дочерние контексты являются дочерними элементами фонового контекста.
Когда я обновляю элементы в дочерних контекстах в фоновом потоке на 6, они никогда не сливаются с основным контекстом, пока я не перезапущу приложение, а основной контекст выберет их из хранилища. Однако на ios7 все работает отлично. Как я могу обеспечить, чтобы основной контекст правильно обновлял слияние без сбоев и перезагрузки db?
Я знаю, что IOS 7 включен asynchrounous доступа SQL по умолчанию, но я сделал это на 6 с:
NSSQLitePragmasOption : @{@"journal_mode" : @"WAL"}
Вот как мои для Context устанавливаются:
self.mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[self.mainManagedObjectContext setPersistentStoreCoordinator:self.mainPersistentStoreCoordinator];
[self.mainManagedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];
[self.mainManagedObjectContext setUndoManager:nil];
self.backgroundParentContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[self.backgroundParentContext setPersistentStoreCoordinator:self.backgroundPersistentStoreCoordinator];
[self.backgroundParentContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];
[self.backgroundParentContext setUndoManager:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backgroundContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:self.backgroundParentContext];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mainContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:self.mainManagedObjectContext];
Здесь как создать контекст ребенка:
- (NSManagedObjectContext *)newChildManagedObjectContext
{
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[childContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
[childContext setParentContext:self.backgroundParentContext];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidSave:)
name:NSManagedObjectContextDidSaveNotification object:childContext];
[childContext setUndoManager:nil];
return childContext;
}
Вот методы уведомления:
- (void)mainContextDidSave:(NSNotification *)notification
{
__block NSNotification *strongNotification = notification;
[self.backgroundParentContext performBlockAndWait:^{
[self.backgroundParentContext mergeChangesFromContextDidSaveNotification:strongNotification];
}];
}
- (void)backgroundContextDidSave:(NSNotification *)notification
{
[self.mainManagedObjectContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:notification waitUntilDone:NO];
}
- (void)managedObjectContextDidSave:(NSNotification *)notification
{
[self.backgroundParentContext performBlockAndWait:^{
NSError *error = nil;
if (![self.backgroundParentContext save:&error]) {
DNSLog(@"error saving context: %@", error);
}
}];
}
UPDATE:
Ну похоже, что это не просто никогда не будет работать на 6. По документацию, они изменили совсем немного вокруг сливающихся контекстов для 7. Так что я буду иметь, чтобы возьмите другой подход для 6, я думаю ...