0

我需要 Apple 文档中的一些说明

提取请求必须至少有一个排序描述符。如果控制器生成节,则数组中的第一个排序描述符用于将对象分组为节;它的键必须与 sectionNameKeyPath 相同,或者使用其键的相对顺序必须与使用 sectionNameKeyPath 的顺序匹配

我通过NSFetchedResultsController以下方式使用 with 部分

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

先感谢您。

4

1 回答 1

1

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

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

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

编辑

例如,假设您有两个排序描述符:sd1sd2. sd1使用与在 中提供给 FRC 相同的密钥sectionNameKeyPathsd2使用不同的密钥。

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

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

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

如果您可以在不指定与第一个排序描述符相同的键的情况下完成此操作,那么一切都会正常工作。如果不是,那么您应该使用与第一个排序描述符相同的节键。

于 2012-09-03T15:12:49.740 回答