Ios 基于有序对多关系的排序描述符

Ios 基于有序对多关系的排序描述符,ios,objective-c,swift,core-data,Ios,Objective C,Swift,Core Data,我的核心数据模型说明: 项目和问题实体 项目与名为问题的问题具有一对多的有序关系 问题与名为parentProject的项目具有一对一关系 以下是获取问题的代码: let fetchRequest = NSFetchRequest(entityName: "Issue") fetchRequest.predicate = NSPredicate(format: "parentProject CONTAINS[cd] %@", argumentArray: [project])

我的核心数据模型说明:

  • 项目和问题实体
  • 项目与名为问题的问题具有一对多的有序关系
  • 问题与名为parentProject的项目具有一对一关系
以下是获取问题的代码:

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
尽管我有来自项目对象的所有问题,但我更喜欢使用fetched results controller获取问题,因此它们将始终被更新,并且我喜欢与表的集成。我也喜欢在使用FRC显示项目之前,在导航控制器屏幕中显示

正如您在代码中看到的,问题是按name参数排序的

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

AFAIK I在用于核心数据时不能将NSSortDescriptor与比较器/选择器一起使用


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

如果您使用关系键路径(在您的案例中是
parentProject
),它将根据排序集进行排序。所以你可以用

fetchRequest.sortDescriptors = [NSSortDescriptor(key: "parentProject.name", ascending: true),NSSortDescriptor(key: "parentProject", ascending: true)]
这将首先按项目对它们进行排序,然后在每个项目组中,它将按照与关系中的有序集相同的顺序进行排序。或者,您可以使用
sectionNameKeyPath
将每个问题的项目放在不同的部分


如果您不先使用
parentProject.name
(或类似于
parentProject.lastUpdated
)的名称,则它们将仅根据orderedSet的顺序进行排序。换句话说,它将是所有的第一个问题,然后是所有的第二个问题等等。这可能不是您想要的。

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

这可能是一个错误,但无论如何。在我看来,你的第一次取回是一个过滤器。。e、 g.向我展示该项目的问题。也许您可以对选定的问题执行第二次提取,这次不过滤它们,而是对它们进行排序

关于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<NSFetchRequestResult>(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]
func fetchItem(){
打印(#功能)
让sortDescriptor:NSSortDescriptor!
默认设置:UserDefaults=UserDefaults.standard
如果默认值为.integer(forKey:“sequenceSwitchValue”)==0{
sortDescriptor=NSSortDescriptor(键:“itemName”,升序:true,选择器:#选择器(NSString.localizedCaseInsensitiveCompare(35;:))
}否则{
sortDescriptor=NSSortDescriptor(键:“itemName”,升序:false,选择器:#选择器(NSString.localizedCaseInsensitiveCompare(35;:))
}
让上下文=(UIApplication.shared.delegate为!AppDelegate)。persistentContainer.viewContext
let request=NSFetchRequest(entityName:itemEntity)
request.sortDescriptors=[sortDescriptor]
let谓词:NSPredicate=NSPredicate(格式:“itemName==%@”,incomingItemName)
request.predicate=谓词
做{
items=try context.fetch(请求)as![ItemEntity]
}将let错误捕获为NSError{
打印(“从数据库提取数据时出错:\(Error.userInfo)”)
}
如果items.count>0{
让currentItem=items[0]

您可以在谓词中使用关系值。

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

为什么不使用:-NSSortDescriptor*sortStates=[NSSortDescriptor sortdescriptor with key:@“states”升序:无比较器:^(id obj1,id obj2){@Vizllx正如我在问题中提到的,带有比较器和选择器的排序描述符不能作为获取请求排序描述符***由于未捕获的异常“NSInvalidArgumentException”终止应用程序,原因:“不支持的NSSortDescriptor(不支持比较器块)”您能说出保留“问题”的参数吗作为Project中的OrderedSet?您是想让来自不同项目的问题分散在列表中,还是希望它们组合在一起?我过去遇到过这个问题,据我所知,在FetchRequest中不可能以“OrderedSet顺序”返回
OrderedSet
的内容。这不是你想要的答案,我能建议的最好办法是向苹果公司提出一个bug。你如何按
parentProject
哪个是ObjectID进行排序?
parentProject
是一种关系。核心数据足够聪明,可以识别出这是一种排序关系,并以排序deredset的相同方式进行排序。我无法做到这一点。简单地说放,我认为用orderedSet做NSFRC是不可行的。我删除了我的NSFRC,并用我自己的方法处理了所有事情。我用这段代码做了一个测试项目,它工作了。我想知道我们做了什么不同。是的,但是当位置发生变化时,你计划更新每一个自对象吗?我不必更新每一个问题。只是受位置影响的项目内部会发生变化。每次在数组的索引处插入项时都会发生这种情况。因此,除非在每个项目中经常对问题进行重新排序,否则我看不出有什么大问题。我使用的项目是不断地重新排序(拖放功能).所以这不起作用。真遗憾。我觉得这不可能。现在就向苹果公司提交一个bug。