快速排序具有许多关系的实体数组


func fetchCD() -> [Entity] {
  var options : [Entity] = []
  let fetchRequest = NSFetchRequest(entityName:"EntityName")
  do {
    options = try cdh.managedObjectContext.executeFetchRequest(fetchRequest) as! [Entity]
  } catch let error as NSError {
    print("Fetch failed: (error.localizedDescription)")
  } catch {
  }
  //here I'd like to order by Entity.types.counter (desc) 
  return options
}
//Entity+CoreDataProperties.swift
extension Entity {
    //my values
    @NSManaged var types: NSSet?
}

//Type+CoreDataProperties.swift
extension Type {
@NSManaged var counter: NSNumber
}

我如何按 conter 对我的 [实体] 数组进行排序,它是类型实体上的属性(与实体有很多关系(?

简短的回答是你不能,因为它没有任何意义。 您希望基于多个对象对单个对象进行排序。

现在,如果您想根据最高Type或最大TypeEntityName进行排序,那么这将是一个不同的问题和一个可以解决的问题。

排序需要对"价值"问题有一个一致的答案。 检查许多Type对象时,EntityName应根据什么值进行排序?

是否应该基于Type对象的数量? 这是可以排序的。

它应该基于Type对象的存在吗? 这也可以排序。

您还可以扭转这种情况并获取所有Type实体对象,根据counter对它们进行排序,然后在排序完成后检索与Type实体关联的EntityName对象。 那么你的代码将如下所示:

func fetchCD() -> [Entity] {
  let fetchRequest = NSFetchRequest(entityName:"Type")
  fetchRequest.sortDescriptors = [NSSortDescriptor("counter", ascending: true)]
  do {
    let results = try cdh.managedObjectContext.executeFetchRequest(fetchRequest) as! [Type]
    let options = results.map($0.entity) as! [Entity]
    //Type is already sorted
    return options
  } catch {
    fatalError("Fetch failed: (error)")
  }
}

这段代码不是 100%,因为我无权访问您的项目,我不会像这样命名我的实体。 但出于演示目的,它向您展示了一个选项。

如果它是可访问的值,则可以使用 sortInPlace 对数组进行排序。

你只需要指定如何访问该值,以及如何比较它,我认为你可以这样调用,检查它是否对你有帮助。

options.sortInPlace({ $0.types.counter < $1.types.counter })

最新更新