NSFetchedResultsController:需要doc澄清

时间:2012-09-03 13:48:39

标签: ios core-data nsfetchedresultscontroller nsfetchrequest

我需要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 匹配?你能给我一个解释吗?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果您正在使用部分,那么FRC需要知道如何对数据数组进行排序,以便它可以按部分对所有结果进行分组。因此,无论您在获取请求中指定为第一个排序描述符,都必须与您的部分的分组方式相匹配,以便FRC可以正确地执行此操作。

您不必指定它们的确切字段,但排序顺序应该相同。

例如,如果您的第一个排序描述符按部分对数组进行分组,即使它没有引用该部分,那也没关系。在大多数情况下,您应该明确指定您的section属性以消除FRC方面的任何混淆可能性 - 否则它将引发异常。

修改

例如,假设您有两个排序描述符:sd1sd2sd1使用与sectionNameKeyPath中的FRC相同的密钥。 sd2使用不同的密钥。

当您对整个数组进行排序时,如果它们都生成了一个最终数组,该数组将相同部分中的实体分组,那么您可以使用sd1sd2作为第一个排序描述符。

基本上,他们FRC会根据sectionNameKeyPath将实体分组到部分中,这样就可以确定有多少部分,以及每个部分中有多少行。因此,它作为输入获得的数组必须相对于sectionNameKeyPath进行相似的分组。

当它在数组中徘徊时,它会查看sectionNameKeyPath并期望看到具有相同sectionNameKeyPath的特定数量的条目。因此,必须对数组进行排序以将所有部分保持在一起。

如果你可以在不指定与第一个排序描述符相同的键的情况下完成它,那么一切都会正常工作。如果没有,那么你应该使用与第一个排序描述符相同的section key。