2013-10-24 64 views
0

我遇到了与我的核心数据实现和线程相关的问题。它在iOS 7上正常工作,但无法在iOS 6上正常刷新主环境。CoreData线程。 iOS 6 vs 7

我有两个NSPersistentStoreCoordinators指向同一个数据库文件。然后我有一个主要背景和背景背景。所有新的子上下文都是后台上下文的子项。

当我更新6上后台线程中子上下文的项时,它们从不合并到主上下文,直到我重新启动应用程序,并且主上下文从存储中获取它们。在ios7上,这一切都很好。我如何确保主要上下文正确刷新合并而不发生错误并重新加载数据库?

我知道的iOS 7默认开启 - 异步SQL访问,但我已经做了上6:

NSSQLitePragmasOption : @{@"journal_mode" : @"WAL"} 

这里是我的上下文的是如何设置:

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

我没有在iOS 6上使用两个NSPersistentStoreCoordinators,但在WWDC期间明确提到了来自不同商店协调员的上下文之间的合并更改,所以我认为它在iOS 7中已更改。参见以下会议:

  • 207 - 核心数据有什么新内容(从第145张幻灯片开始)。核心数据性能(从幻灯片编号91开始),