NSFetchedResultsController が、新しくインポートされたオブジェクトの更新を取得していません。
バックグラウンド スレッドで、メイン コンテキストの子ではない NSManagedObjectContext を作成し、オブザーバーを追加して、変更をマージできるようにします。
NSManagedObjectContext *localContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [localContext setPersistentStoreCoordinator:[[NSManagedObjectContext defaultContext] persistentStoreCoordinator]]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:nil]; … -(void) contextDidSave:(NSNotification*) notification { if(![notification.object isEqual:[NSManagedObjectContext MR_defaultContext]] && ![notification.object isEqual:[NSManagedObjectContext MR_rootSavingContext]]) { NSDictionary *userInfo = [notification userInfo]; NSLog(@"updated: %i, inserted: %i", [userInfo[@"updated"] count], [userInfo[@"inserted"] count]); dispatch_async(dispatch_get_main_queue(), ^ { [[NSManagedObjectContext MR_defaultContext] mergeChangesFromContextDidSaveNotification:notification]; }); } }
- 私はオブジェクトを作成し、その「可視」属性を NO に設定します。
- コンテキストを保存します。
- オブジェクトの「visible」属性を YES に更新します。
コンテキストを保存します。
MyEntity *entity = [MyEntity insertInManagedObjectContext:localContext]; entity.dateCreated = [NSDate date]; if (![localContext save:&error]) { NSLog(@"%@", error); } [entity setVisibleValue:YES]; if (![localContext save:&error]) { NSLog(@"%@", error); }
にはNSFetchedResultsController
、「visible」属性でフィルタリングする fetchedRequest があります。
更新は contextDidSave: によって受信されています。
時々、オブジェクトはそれを作成し、 によって挿入されますNSFetchedResultsController
。これは、私が正しくやっていると思わせ、CoreData のバグを見ているのです。一方、mergeChangesFromContextDidSaveNotification
メソッドで正確に何が起こっているのかわかりません。
問題を特定するために使用したコードは、https://github.com/onato/CoreDataImportTestにあります。