Bra*_*ter 7 core-data key-value-observing nssortdescriptor nsfetchedresultscontroller ios6
它使用核心数据时,许多-关系,这是很很难区分使用读取请求是一个长期存在的问题,NSSortDescriptor在Parent基于数量的实体children是一个一对多的关系,一个Child实体.这与a结合使用特别有用NSFetchedResultsController.通常将排序描述符初始化为:
NSSortDescriptor *sortByNumberOfChildren = [[NSSortDescriptor alloc] initWithKey:@"children.@count" ascending:NO];
Run Code Online (Sandbox Code Playgroud)
导致例外'Keypath containing KVC aggregate where there shouldn't be one; failed to handle children.@count
在iOS 6.1上,我通过将KVO访问器-countOf<Key>作为属性添加到我的托管对象模型中作为整数类型发现了一个修复.我没有在我的NSManagedObject子类中为这个属性实现任何东西,因为所有的魔法似乎都在幕后发生.(请参阅/sf/answers/1088246001/).
但是,这在iOS 6.0上不起作用.在这里,我发现将以下方法添加到NSManagedObject子类可以解决问题:
- (NSUInteger)countOfChildren{
return [self.children count];
}
Run Code Online (Sandbox Code Playgroud)
同时添加并没有在这两种SDK的解决这个问题.相反,它打破了修复.
有没有人知道为什么会发生这种情况以及为什么两者之间存在差异,尽管在iOS 6.0和iOS 6.1之间没有提及Core Data或Foundation的更改.
我认为通过说"Keepath包含KVC聚合,其中不应该有一个;未能处理孩子.@ count"Core Data想要告诉你它不支持这种排序描述符.这很可能是因为当支持SQLite存储收到您的获取请求时,它必须生成执行获取请求描述的SQL."孩子.@计数"的情况实际上比人们想象的更复杂.
覆盖-countOfChildren的"修复"并不是真正的修复.让我们假设这一问题解决了问题,然后在每个Parent上调用-countOfChilden.当您第一次访问self.children时,Core Data需要执行一个SQL查询,该查询确定(至少)子项的主键,创建NSManagedObjectIDs,NSManagedObjects并返回结果.如果这有效,那么你会看到非常糟糕的表现.
您的问题有几种解决方案.
1.将子计数存储在持久属性中
只需将一个属性(名称:cachedCountOfChildren,类型:整数64位)添加到您的父实体.在您的控制器层(不在您的模型层中)每次将子项分配给父项时,将cachedCountOfChildren增加1,并在每次从父项中删除子项时减少cachedCountOfChildren.然后在排序描述符键中使用cachedCountOfChildren.这将有很好的表现.
2.使用字典结果
将NSFetchRequest的resultType设置为NSDictionaryResultType.这将导致-executeFetchRequest:error:返回NSDictionaries而不是NSManagedObjects.带有NSDictionaryResultType的NSFetchRequest可以执行不同的操作.例如,您可以使用setPropertiesToGroupBy和NSExpression(...).请查看WWDC会话"使用iCloud with Core Data(2012)"(从幻灯片122开始)以供参考.基本上,它们向您展示如何构造一个请求,该请求将返回一个包含具有此结构的字典的数组:
(
{
countOfChildren = 1;
parentName = "hello";
},
{
countOfChildren = 134;
parentName = "dsdsd";
},
{
countOfChildren = 2;
parentName = "sdd";
}
)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,您将获得未分类的结果.但是countOfChildren对这个数组进行排序可以非常有效地在内存中完成.在这种情况下,Core Data生成的SQL也非常有效,您将能够准确指定字典应包含的属性.因此结果也应该是非常高效的内存.此解决方案的优势在于您无需跟踪countOfChildren.
您必须根据自己的情况决定哪种解决方案最适合自己.
| 归档时间: |
|
| 查看次数: |
1875 次 |
| 最近记录: |