Skip to main content
 首页 » 操作系统

swift之如何在一对多关系的 NSSet 上应用 NSSortdiscriptor 或 NSPredicate

2024年01月01日34zhoujg

我想对 NSSet 中的获取请求返回的对象进行排序或过滤(从一对多关系)。这里的 routineSplitsRel 是 RoutineSplits 的 NSSet,应该在“displayOrder”中返回。应用 sortdescriptor1 会返回一条错误消息:

'to-many key not allowed here'

class Routines: NSManagedObject { 
 
@NSManaged var id: NSNumber 
@NSManaged var isdeleted: NSNumber 
@NSManaged var name: String 
@NSManaged var repetitions: String 
@NSManaged var uid: String 
@NSManaged var updatedat: NSDate 
@NSManaged var displayOrder: NSNumber 
@NSManaged var trainingdayRel: NSSet 
@NSManaged var exercisesRel: NSSet 
@NSManaged var routineSplitsRel: NSSet 
 
} 
 
class RoutineSplits: NSManagedObject { 
 
@NSManaged var id: NSNumber 
@NSManaged var uid: String 
@NSManaged var displayOrder: NSNumber 
@NSManaged var isdeleted: NSNumber 
@NSManaged var name: String 
@NSManaged var routinesRel: myTP.Routines 
 
} 

获取请求:

    let fetchRequest = NSFetchRequest(entityName: "Routines") 
    let sortDescriptor = NSSortDescriptor(key: "displayOrder", ascending: true) 
    let sortDescriptor1 = NSSortDescriptor(key: "routineSplitsRel.displayOrder", ascending: true) 
    fetchRequest.predicate = NSPredicate(format: "isdeleted == %@",NSNumber(bool: false)) 
    fetchRequest.sortDescriptors = [sortDescriptor,sortDescriptor1] 

请您参考如下方法:

您不能直接对一对多关系进行排序。 您需要获取它们,然后才能对它们进行排序。 当您获得 NSSet 时,您可以使用 mySet.allObjects()

将其“转换”为 Array

所以会是这样的

fetchResults.allObjects.sort({ $0.displayOrder.integerValue > $1.displayOrder.integerValue })