我面临一个奇怪的问题,即NSFRC fetchedObjects数组不返回它应该的所有对象。为了给你一些上下文,我的应用程序有几个列表视图控制器,每个控制器都有一个NSFRC。我正在更新委托方法controllerDidChangeContent中的列表视图。我面临的问题是:在将对象存储在后台MOC并保存之后,调用controllerDidChangeContent但是我刚刚保存在后台线程中的对象没有出现在NSFRC中。这是我用来检查这段代码的一段代码:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
NSManagedObjectContext *context = controller.managedObjectContext;
NSError *error = nil;
NSArray *array = [context executeFetchRequest:controller.fetchRequest error:&error];
if (nil != array) {
NSUInteger count = MIN(controller.fetchedObjects.count, array.count);
for (NSUInteger index=0; index<count; index++) {
NSManagedObject *a = array[index];
NSManagedObject *b = controller.fetchedObjects[index];
// Here you will see that sometimes the objects don't match
NSLog(@"%d: %@ <--> %@", index, [[a body] text], [[b body] text]);
}
}
}
我期望NSFRC fetchedObjects数组与手动executeFetchRequest返回的数组相同(我使用NSFRC fetchRequest来手动获取数据)。然而,这种情况并非如此。手动executeFetchRequest返回的对象多于NSFRC fetchedObjects。有谁知道发生了什么?我已经关闭了NSFRC上的缓存,但报告了相同的行为。
谢谢!
===更新====
该问题的一些更新。我认为Core Data中存在一个错误,因为我能够看到来自NSFRC的一些不一致的结果,而且能够通过涉及“触摸”相关对象的解决方法来解决问题。这是一个解释正在发生的事情的场景:
想象一下以下Core Data模型: - 有Cat对象和Master对象。 - 一只猫可以有一个或多个主人。 - 师父可以拥有一只或多只猫。 - 创建第一个NSFRC(让我们称之为NSFRC_A)来获取所有具有名为“Master_A”的主人的猫。谓词是{ANY master.name ==“Master_A”}。 - 创建第二个NSFRC(让我们称之为NSFRC_B)来获取所有具有名为“Master_B”的主人的猫。谓词是{ANY master.name ==“Master_B”}。 - 有一个主要的托管对象上下文仅在UI线程中使用 - 为每个后台线程创建了一个后台管理对象上下文,使用与主要管理对象上下文相同的持久存储。
在后台创建名为“Cat_A”的猫并将其分配给主“Master_A”。保存后台上下文后,将正确更新主上下文。此时,NSFRC_A通知其代理已发生更改并正确报告“Cat_A”。
稍后,在后台线程中,同一只猫“Cat_A”被分配为主“Master_B”。保存后台上下文后,将正确更新主上下文。此时,NSFRC_A会通知其代理该更改并正确报告“Cat_A”。 NSFRC_B还通知其代理该更改但不报告“Cat_A”(它的fetchedObjects中缺少它)。但是,如果我使用与NSFRC_B相同的fetchRequest手动执行提取,我可以看到返回“Cat_A”。奇怪的是,返回的“Cat_A”实例被标记为故障,这解释了为什么NSFRC_B不返回“Cat_A”,因为它没有在内存中看到它。
这是一个错误,因为当后台线程的更改合并到主上下文中时,我可以通过简单地将“Cat_A”关系记录到master来修复该行为:日志记录基本上触及对象并强制它实现为存储器中。
答案 0 :(得分:1)
问题似乎是NSFRC的限制。根据Apple论坛上的这个主题(https://devforums.apple.com/message/765374):“限制是实体A的获取结果控制器不会总是捕获实体B的更新,这将导致谓词要改变。“为了解决这个问题,我必须在将它合并到主线程之前弄脏我正在寻找的对象:然后NSFRC检测到这种变化。