基于有序多对多关系对描述符进行排序

Chr*_*ris 23 core-data objective-c ios swift

我的核心数据模型的描述:

  • 项目和问题实体
  • 项目与问题命名问题有一个有序的一对多关系
  • 问题与名为parentProject的Project具有一对一的关系

以下是我获取问题的代码:

let fetchRequest = NSFetchRequest(entityName: "Issue")
    fetchRequest.predicate = NSPredicate(format: "parentProject CONTAINS[cd] %@", argumentArray: [project])
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]

    let frc = NSFetchedResultsController(
        fetchRequest: fetchRequest,
        managedObjectContext: dataManager.context,
        sectionNameKeyPath: nil,
        cacheName: nil)

    return arc
Run Code Online (Sandbox Code Playgroud)

即使我有项目对象的所有问题,我更喜欢使用获取结果控制器获取问题,因此它们将始终更新,我喜欢与表的集成.在使用FRC显示项目之前,我也喜欢导航控制器屏幕中的那个.

正如您在代码中看到的那样,问题按名称参数排序.

但是我希望它们按照我将它们保存在项目的NSMutableOrderedSet中的顺序进行排序.

AFAIK当它用于核心数据时,我不能将NSSortDescriptor与比较器/选择器一起使用.

你知道怎么做吗?提前致谢.

Jon*_*ose 3

如果您使用关系键路径(在您的情况下parentProject),它将根据有序集进行排序。所以你可以使用

fetchRequest.sortDescriptors = [NSSortDescriptor(key: "parentProject.name", ascending: true),NSSortDescriptor(key: "parentProject", ascending: true)]
Run Code Online (Sandbox Code Playgroud)

这将首先按项目对它们进行排序,然后在每个项目组内将按照与关系中的有序集相同的顺序进行排序。您也可以选择使用 来将每个问题的项目放在不同的部分中sectionNameKeyPath

如果您首先不使用parentProject.name (或类似的东西parentProject.lastUpdated),那么它们只会根据orderedSet的顺序进行排序。换句话说,这将是所有第一期,然后是所有第二期,依此类推。这可能不是您想要的。