我正在使用带有ClassicWithBackgroundCoordinatorSQLiteMagicalRecordStack
堆栈和NSFetchedResultsController的MagicalRecord 3.0。在Magical Record使用后台线程(通过[MagicalRecord saveWithBlock:]
)保存新的相关数据之后,NSFetchedResultsController没有被更新的问题。
如此初始化堆栈:
MagicalRecordStack *stack = [[ClassicWithBackgroundCoordinatorSQLiteMagicalRecordStack alloc] initWithStoreNamed:@"Mailstrom.sqlite"];
[MagicalRecordStack setDefaultStack:stack];
NSFetchedResultsController初始化如下:
NSFetchRequest *request = [NSClassFromString(_entityName)
MR_requestAllSortedBy:_weightProperty
ascending:NO
withPredicate:[NSPredicate predicateWithFormat:@"%K>%d", _weightProperty, 0]];
request.sortDescriptors = @[ [[NSSortDescriptor alloc] initWithKey:_weightProperty ascending:NO] ];
_fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:[[MagicalRecordStack defaultStack] context]
sectionNameKeyPath:nil
cacheName:nil];
self.fetchedResultsController.delegate = self;
[_fetchedResultsController MR_performFetch];
偶尔会通过[MagicalRecord saveWithBlock:]
进行保存,但大多数情况下,仅为背景上下文发送NSManagedObjectContextWillSaveNotification
,而FRC只是坐在那里:
====>> context will save: saveWithBlock:completion: on *** BACKGROUND THREAD ***
在这种情况下,FRC永远不会收到通知,并且其代理人的controllerWillUpdateContent
永远不会被解雇。
我觉得这可能是一个简单的问题 - 更好地致电扫罗! ;)任何帮助表示赞赏。
答案 0 :(得分:0)
如果您的保存最终到达默认上下文,那么您获取的结果控制器最终将使用最新信息重新加载。可能是ClassicWithBackgroundCoordinatorMagicalRecordStack未正确设置以通过该堆栈的“context”属性进行保存。
答案 1 :(得分:0)
我想我想出来了。
当在后台PSC中更新值时,需要调整主上下文以查看对象的更改。最简单的方法是通过URI-> ObjectID-> Object查找主对象库中的值,并在[MagicalRecord save]块内运行[willAccessValueForKey:nil]。这样,当更改合并到主上下文中时,即使来自后台PSC的更新只是更改,他们也会知道它们已经出现故障。