我需要Apple文档中的一些说明
获取请求必须至少有一个排序描述符。如果 controller生成节,数组中的第一个排序描述符 用于将对象分组为多个部分;它的关键必须是 与sectionNameKeyPath 相同或使用其键必须的相对排序 使用sectionNameKeyPath 匹配。
我正在以下列方式使用NSFetchedResultsController
部分
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:mainContext
sectionNameKeyPath:@"paymentDate"
cacheName:nil];
正如我从文档中所理解的那样,我在NSFetchRequest
传递的NSFetchedResultsController
必须至少有一个排序描述符。但由于我使用了部分,因此排序描述符必须如下所示:
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:
[NSSortDescriptor sortDescriptorWithKey:@"paymentDate" ascending:YES],
[NSSortDescriptor sortDescriptorWithKey:@"paymentCode" ascending:YES],
nil]];
如果我使用像
这样的排序描述符[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:
[NSSortDescriptor sortDescriptorWithKey:@"paymentCode" ascending:YES],
nil]];
我收到如下错误
NSFetchedResultsController错误:索引X处的获取对象具有 乱序部分名称Y.对象必须按部分名称'
排序
就我而言,使用[NSSortDescriptor sortDescriptorWithKey:@"paymentDate" ascending:YES]
,它可以让我克服这个问题。也许我只是幸运;)。
但是,它是什么意思或使用其密钥的相对排序必须与使用sectionNameKeyPath 匹配?你能给我一个解释吗?
提前谢谢。
答案 0 :(得分:1)
如果您正在使用部分,那么FRC需要知道如何对数据数组进行排序,以便它可以按部分对所有结果进行分组。因此,无论您在获取请求中指定为第一个排序描述符,都必须与您的部分的分组方式相匹配,以便FRC可以正确地执行此操作。
您不必指定它们的确切字段,但排序顺序应该相同。
例如,如果您的第一个排序描述符按部分对数组进行分组,即使它没有引用该部分,那也没关系。在大多数情况下,您应该明确指定您的section属性以消除FRC方面的任何混淆可能性 - 否则它将引发异常。
修改强>
例如,假设您有两个排序描述符:sd1
和sd2
。 sd1
使用与sectionNameKeyPath
中的FRC相同的密钥。 sd2
使用不同的密钥。
当您对整个数组进行排序时,如果它们都生成了一个最终数组,该数组将相同部分中的实体分组,那么您可以使用sd1
或sd2
作为第一个排序描述符。
基本上,他们FRC会根据sectionNameKeyPath
将实体分组到部分中,这样就可以确定有多少部分,以及每个部分中有多少行。因此,它作为输入获得的数组必须相对于sectionNameKeyPath
进行相似的分组。
当它在数组中徘徊时,它会查看sectionNameKeyPath
并期望看到具有相同sectionNameKeyPath
的特定数量的条目。因此,必须对数组进行排序以将所有部分保持在一起。
如果你可以在不指定与第一个排序描述符相同的键的情况下完成它,那么一切都会正常工作。如果没有,那么你应该使用与第一个排序描述符相同的section key。