如何编写具有多个排序描述符的 NSFetchRequest?

How to write NSFetchRequest with multiple sort descriptors?

我有一个具有 dateOfBirth 属性的 Student 实体。

我想从 Student 实体中按出生日期升序获取所有学生,但按月份降序分组。

例如:同月的学生按升序分组在一起,但所有组都按降序排列。

Section 1: December 2019
-- student 1: DOB - 1 December 2019
-- student 2: DOB - 2 December 2019
-- student 3: DOB - 3 December 2019
Section 2: November 2019
-- student 1: DOB - 1 November 2019
-- student 2: DOB - 2 November 2019
-- student 3: DOB - 3 November 2019
Section 3: October 2019
-- student 1: DOB - 1 October 2019
-- student 2: DOB - 2 October 2019
-- student 3: DOB - 3 October 2019

是否可以写一个NSFetchRequest来支持这个查询?我必须使用 NSFetchResultsController 来填充 UITableView 但我无法编写提取请求。

为了按 dateOfBirth 对学生进行分组,我有一个额外的属性,它是一个带有日期格式 yyyyMMyearMonthString。我正在使用 yearMonthString 属性对学生进行分组。

let studentFetchRequest: NSFetchRequest<Student> = Student.fetchRequest()
studentFetchRequest.predicate = NSPredicate(format: "%K != nil AND %K != nil", #keyPath(Student.dateOfBirth), #keyPath(Student.yearMonthString))

let dateSortDescriptor = NSSortDescriptor(key: #keyPath(Student.dateOfBirth), ascending: false)
studentFetchRequest.sortDescriptors = [dateSortDescriptor]

let frc = NSFetchedResultsController<Student>(fetchRequest: studentFetchRequest,
                                              managedObjectContext: managedContext,
                                              sectionNameKeyPath: #keyPath(Student.yearMonthString),
                                              cacheName: nil)

如果我将 dateSortDescriptor 设为升序,则所有部分也将变为升序,如果我将 dateSortDescriptor 设为降序,则该部分内的学生将变为降序。

写这个获取请求的正确方法是什么?是否可以为部分提供不同的排序描述符?

使用两个排序描述符,一个按 year/month 排序(降序),另一个按出生日期排序(升序):

let groupSortDescriptor = NSSortDescriptor(key: #keyPath(Student.yearMonthString), ascending: false)
let dateSortDescriptor = NSSortDescriptor(key: #keyPath(Student.dateOfBirth), ascending: true)
studentFetchRequest.sortDescriptors = [groupSortDescriptor, dateSortDescriptor]