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
或最大Type
对EntityName
进行排序,那么这将是一个不同的问题和一个可以解决的问题。
排序需要对"价值"问题有一个一致的答案。 检查许多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 })