jbo*_*vet 6 core-data objective-c ios
我面临一个奇怪的问题,一个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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我期望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来修复该行为:日志记录基本上触及对象并强制它实现到内存中.
这个问题似乎是 NSFRC 的限制。根据 Apple 论坛 (https://devforums.apple.com/message/765374) 上的这个帖子:“限制是实体 A 的获取结果控制器并不总是捕获实体 B 的更新,这会导致谓词要改变”。为了解决这个问题,我必须在将要查找的对象合并到主线程之前将其弄脏:然后 NSFRC 会检测到该更改。
| 归档时间: |
|
| 查看次数: |
371 次 |
| 最近记录: |