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 的舞蹈的主要内容,如果未能解决你的问题,请参考以下文章