CoreData导入未被NSFetchedResultsController捕获

时间:2013-07-11 12:34:02

标签: objective-c cocoa core-data nsfetchedresultscontroller

我的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);
    }
    
  6. NSFetchedResultsController有一个fetchedRequest,可以过滤“visible”属性。

    contextDidSave正在接收更新:。

    有时候,对象确实可以创建并由NSFetchedResultsController插入。这让我觉得我正在做的事情,我正在看一个CoreData错误。另一方面,我不确定mergeChangesFromContextDidSaveNotification方法究竟发生了什么。

    我可以在https://github.com/onato/CoreDataImportTest

    找到用于隔离问题的代码

0 个答案:

没有答案