-[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:]の使い方(多分合ってる)

  1. UIは当然MainThread。MainTreadのNSManagedObjectContextは一つだけ
  2. メインスレッド以外の各スレッドは変更/削除のみ。スレッドごとにNSManagedObjectContextをもつ

て前提で。


NSManagedObjectContextの生成。これは、ただ一つのクラスのみが行う。
managedObjectContextプロパティがそれを担うが外部からはスレッドだの何だのは見せない。
XcodeのCoreData込みテンプレートのXXX_AppDelegateがベース。

- (NSManagedObjectContext *)managedObjectContext
{
    // 別スレッド用NSManagerdObjectContext
    if(![NSThread isMainThread]) {
        id moc = [[[NSThread currentThread] threadDictionary] objectForKey:@"BSCoreDataManagerManagedObjectContext"];
        if(moc) return moc;
        
        moc = [[[NSManagedObjectContext alloc] init] autorelease];
        [moc setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
        [[[NSThread currentThread] threadDictionary] setObject:moc
                                                        forKey:@"BSCoreDataManagerManagedObjectContext"];
        // NSManagedObjectContextDidSaveNotificationを受ける
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(anotherContextDidSave:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:moc];
        // マージポリシーは変更した方(別スレッド)優先
        [moc setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
        
        return moc;
    }
    
    if(managedObjectContext != nil) {
        return managedObjectContext;
    }
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if(coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }
    
    return managedObjectContext;
}
// 保存されたらマージポリシーに沿ってマージしてもらう
- (void)anotherContextDidSave:(NSNotification *)notification
{
    [managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}

以上!簡単!

編集を行うスレッドでは編集後必ずsave:する。


今の所動いてる。