2013-10-24 2 views
0

У меня возникла проблема, связанная с моей основной обработкой данных и потоками. Он отлично работает на 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, я думаю ...

ответ

0

Я не использовал два NSPersistentStoreCoordinators на iOS 6, но слияние изменений между контекстами из разных координаторов магазинов было упомянуто явно во время WWDC, поэтому я думаю, что это изменилось в iOS 7 См. Следующие сессии:

  • 207 - Что нового в данных ядра (начиная с слайда номер 145).
  • 211 - Производительность основных данных (начиная с номера слайда 91),
Смежные вопросы