NSFetchedResultsController:具有相同键的两个排序描述符不起作用。一个降序用于部分,另一个升序用于行

Posted

技术标签:

【中文标题】NSFetchedResultsController:具有相同键的两个排序描述符不起作用。一个降序用于部分,另一个升序用于行【英文标题】:NSFetchedResultsController: Two sort descriptors with the same key not working. One descending for sections, the other ascending for rows 【发布时间】:2013-11-22 17:48:56 【问题描述】:

我使用 NSFetchedResultsController 来填充 TableView。我希望这些部分按日期降序排序,行按日期升序排序。两者都使用键“creation”,并且这些部分具有 sectionNameKeyPath 的瞬态属性,该属性返回日期的字符串,格式为:“Today, Yesterday, 20.11.2013, 19.11.2013, ...”从“creation”日期创建.但是,这些行始终按照第一个排序描述符的顺序进行排序。这种做法有错吗?

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Exercise"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creation" ascending:NO],
                            [NSSortDescriptor sortDescriptorWithKey:@"creation" ascending:YES]];

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                    managedObjectContext:self.context
                                                                      sectionNameKeyPath:@"localizedCreationDate"
                                                                               cacheName:nil];

感谢您提供的任何帮助! br

更新

上述方法行不通。 :) 我通过将第二个日期保存为当天开始的属性来解决它,按降序排列。这也用作 sectionNameKeyPath。此外,对于节标题,使用本地化创建日期。

- (void)setuptFetchedResultsController

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"DNALoggedExercise"];
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDayDate" ascending:NO],
                                [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:self.context
                                                                          sectionNameKeyPath:@"creationDayDate"
                                                                                   cacheName:nil];

【问题讨论】:

【参考方案1】:

在您的第一段代码中,您给出了两个相互矛盾的NSSortDescriptors,因此只考虑了一个,并且可能是第一个。

为了方便而创建第二个日期属性,您将在数据库中引入数据重复,这不是一个好主意。 为什么不按任何顺序对结果进行排序,而只是在 cellForRowAtIndexPathtitleForHeaderInSection 中反向读取数组?更好的是,为什么不在 viewController 中使用一个小的私有方法来准备 NSDictionary 或任何其他方便的数据结构以供以后使用?

【讨论】:

我已经尝试过这种方法,但在插入/删除行时遇到了一些问题。一切都按预期进行,除了在删除每一行并再次添加一个实体时没有填充 TableVIew。但你是对的。这比数据重复要好,我会再试一次并报告结果。 :)

以上是关于NSFetchedResultsController:具有相同键的两个排序描述符不起作用。一个降序用于部分,另一个升序用于行的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?