NSFetchedResultsController、NSManagedObjectContextDidSaveNotification 和 MagicalRecord 的舞蹈

Posted

技术标签:

【中文标题】NSFetchedResultsController、NSManagedObjectContextDidSaveNotification 和 MagicalRecord 的舞蹈【英文标题】:The dance of NSFetchedResultsController, NSManagedObjectContextDidSaveNotification, and MagicalRecord 【发布时间】:2014-05-08 00:11:58 【问题描述】:

问题:我收到 NSManagedObjectContextDidSaveNotification 通知。我将更改合并到我的 NSFetchedResultsController 的上下文中。但是 NSFetchedResultsController 不会触发 didChangeSection、didChangeObject、controllerDidChangeContent 方法。

self.managedObjectContext = [NSManagedObjectContext MR_context]; //set up my own context to avoid deadlocking
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"];
self.fetchedResultsController.delegate = self;
[self.managedObjectContext setStalenessInterval:0];

//listen for changes in the main context:
[[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(managedObjectContextDidSave:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:[NSManagedObjectContext MR_defaultContext]];

- (void)managedObjectContextDidSave:(NSNotification *)notification 
    NSLog(@"[%@ %@] REFRESH!", THIS_FILE, THIS_METHOD); //this happens

    void (^mergeChanges) (void) = ^
        for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) 
            //this happens (a lot)
            [[self.managedObjectContext objectWithID:[object objectID]] willAccessValueForKey:nil];
        
        [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
    ;
    if ([NSThread isMainThread]) 
        mergeChanges();
    
    else 
        dispatch_sync(dispatch_get_main_queue(), mergeChanges);
    


所以,我再次收到通知。但是我获取的结果控制器没有更新。这要死我了!请帮忙!

编辑:也试过这个:

self.fetchedResultsController = [NSManagedObject MR_fetchController:fetchRequest delegate:self useFileCache:NO groupedBy:nil inContext:[NSManagedObjectContext MR_defaultContext]];

这会导致同样的死锁。如果我这样做:

self.fetchedResultsController = [NSManagedObject MR_fetchController:fetchRequest delegate:self useFileCache:NO groupedBy:nil inContext:[NSManagedObjectContext MR_context]]; //note that I just changed the context

fetchedResultsController 不更新其结果。

【问题讨论】:

【参考方案1】:

我不知道您是如何或在哪个上下文中保存的。如果您没有一直保存到持久存储,那么 defaultcontext 不会获得这些更改,并且您的 nsfetchedresultscontroller 也不会更新。您可能需要在本地上下文和 nsfrc 使用的上下文之间建立连接,以便传播更改。

【讨论】:

以上是关于NSFetchedResultsController、NSManagedObjectContextDidSaveNotification 和 MagicalRecord 的舞蹈的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?