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

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

  • 项目和问题实体
  • 项目与问题命名问题有一个有序的一对多关系
  • 问题与名为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 

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

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

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

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

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

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

 fetchRequest.sortDescriptors = [NSSortDescriptor(key: "parentProject.name", ascending: true),NSSortDescriptor(key: "parentProject", ascending: true)] 

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

如果你不使用parentProject.name (或类似的东西 – 比如parentProject.lastUpdated ),那么它们只能按照orderedSet的顺序排序。 换句话说,它将是所有第一个问题,然后是所有第二个问题等。这可能不是你想要的。

这可能是一个kluge,但无论如何。 在我看来,你的第一个提取是一个filter..例如,告诉我这个项目的问题。 也许你可以在选定的问题上执行第二次获取,这次不过滤它们,而是对它们进行排序?

关于CoreData,我有一个这样的排序提取:

  func fetchItem() { print(#function) let sortDescriptor: NSSortDescriptor! let defaults: UserDefaults = UserDefaults.standard if defaults.integer(forKey: "sequenceSwitchValue") == 0 { sortDescriptor = NSSortDescriptor(key: "itemName", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:))) } else { sortDescriptor = NSSortDescriptor(key: "itemName", ascending: false, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:))) } let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext let request = NSFetchRequest(entityName: itemEntity) request.sortDescriptors = [sortDescriptor] let predicate: NSPredicate = NSPredicate(format: "itemName == %@", incomingItemName) request.predicate = predicate do { items = try context.fetch(request) as! [ItemEntity] } catch let error as NSError { print("Error While Fetching Data From DB: \(error.userInfo)") } if items.count > 0 { let currentItem = items[0] 

您可以将关系值用于谓词。

你可能不想听到这个,但不幸的是,你不能。 NSFetchedResultsController无法使用sortDescriptors基于有序的一对多关系进行排序。 您应该向Apple提交错误。 您应该抛弃NSFetchedResultsController并自己处理它的委托方法。

保持顺序的最简单方法是为“问题”实体添加属性。 称为Int类型的position 。 并使用排序描述符,它将按此position属性对实体进行排序