0

NSFetchedResultsController が、新しくインポートされたオブジェクトの更新を取得していません。

  1. バックグラウンド スレッドで、メイン コンテキストの子ではない 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];
                       });
        }
    }
    
  2. 私はオブジェクトを作成し、その「可視」属性を NO に設定します。
  3. コンテキストを保存します。
  4. オブジェクトの「visible」属性を YES に更新します。
  5. コンテキストを保存します。

    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にあります。

4

0 に答える 0