它使用核心数据对多-关系,这是非常困难的排序使用读取请求时,是一个长期存在的问题NSSortDescriptor
在Parent
基于数量的实体children
是一个一对多的关系,一个Child
的实体。 这与组合特别有用NSFetchedResultsController
。 通常,初始化排序描述为:
NSSortDescriptor *sortByNumberOfChildren = [[NSSortDescriptor alloc] initWithKey:@"children.@count" ascending:NO];
导致异常'Keypath containing KVC aggregate where there shouldn't be one; failed to handle children.@count
'Keypath containing KVC aggregate where there shouldn't be one; failed to handle children.@count
在iOS 6.1,我通过添加KVO存取发现了一种修复-countOf<Key>
以我的管理对象模型的属性作为一个整数类型。 我并没有实现在我这个属性什么NSManagedObject
的子类,因为所有的魔力似乎引擎盖下发生的。 (见https://stackoverflow.com/a/15546371/2042527 )。
然而,这并不在iOS 6.0的工作。 在这里,我发现,添加下面的方法到你的NSManagedObject
子类可以解决该问题:
- (NSUInteger)countOfChildren{
return [self.children count];
}
添加既不在这两种SDK的解决这个问题。 相反,它打破了修复。
有没有人有一个线索,为什么发生这种情况,为什么有这两个之间的差异沉绵不存在的iOS 6.0和iOS 6.1之间变化,以核心数据或基金会提。
我认为,说“的keyPath含KVC总在那里,不应该有一个。没对待孩子@算”核心数据要告诉你,它不支持这种类型的描述符。 这是非常有可能,因为当后盾SQLite的商店收到您的读取请求它生成的SQL做什么撷取要求描述。 的情况下“的孩子。@计”,实际上是比人们想象的引擎盖下更复杂。
“修复”与重写-countOfChildren是不是一个真正的修复。 假设一秒钟,这则解决了这个问题-countOfChilden将在每一位家长都被调用。 当您第一次访问self.children然后核心数据需要执行决定(至少)一个SQL查询孩子的主键,创建NSManagedObjectIDs,NSManagedObjects并返回结果。 如果这个工作,然后你会看到表现很糟糕。
有几种解决方案,您的问题。
1.商店孩子在持久属性计数
(:cachedCountOfChildren,类型:名整型64位)只需一个属性添加到您的父实体。 每次你每次从父删除一个孩子的时间分配的孩子家长和减量cachedCountOfChildren时间在你的控制器层(不是在你的模型层)增量cachedCountOfChildren 1。 然后你在你的排序描述符键使用cachedCountOfChildren。 这将有很大的性能。
2.使用字典结果
设置你的NSFetchRequest到NSDictionaryResultType的与resultType。 这将导致-executeFetchRequest:错误:返回NSDictionaries而不是NSManagedObjects。 用NSDictionaryResultType一个NSFetchRequest可以做不同的事情。 例如,你可以使用setPropertiesToGroupBy和NSExpression(...)。 请看WWDC会议上的“使用iCloud的核心数据(2012)”(在幻灯片122起),以供参考。 基本上他们告诉你如何构建将返回其中包含具有这种结构的字典数组的请求:
(
{
countOfChildren = 1;
parentName = "hello";
},
{
countOfChildren = 134;
parentName = "dsdsd";
},
{
countOfChildren = 2;
parentName = "sdd";
}
)
正如你所看到的,你会得到一个未排序的结果返回。 但排序这个数组由countOfChildren可以在内存中非常有效地进行。 通过核心数据生成的SQL也将在这种情况下非常有效,你将能够准确指定属性的字典应该包含的内容。 所以结果也应该是非常有效的内存。 该解决方案具有您不必跟踪countOfChildren的优势。
你必须决定哪个解决方案最适合你自己根据您自己的情况。
文章来源: NSSortDescriptor to sort by number of items in Core Data To-Many Relationships