比较用于Fetchrequest XCode Swift OSX核心数据的谓词中的NSSet

时间:2016-08-11 09:26:02

标签: swift xcode nspredicate nsfetchrequest

我有两个NSManagedObject,如

class Person: NSManagedObject {

    @NSManaged var firstname: String;
    @NSManaged var lastname: String;
    @NSManaged var code: String;
    @NSManaged var position: Int16;
    @NSManaged var lasttime: NSDate;
    @NSManaged var isvip: Int16;    
    @NSManaged var changeposition: NSSet;   
}


class ChangePosition: NSManagedObject {

    @NSManaged var person:Person
    @NSManaged var code: String;
    @NSManaged var from: Int16;
    @NSManaged var to: Int16;
    @NSManaged var time: NSDate;   
}

所以我有一个人有很多ChangePosition作为NSSet。每个ChangePosition都有一个NSDate。

现在我想尝试从具有最高NSDate的Person中获取一个ChangePosition。但我不知道我可以使用的谓词结构。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

所以我的实际工作流程就是这个

let fetchReqPerson = NSFetchRequest(entityName: "Person");
        //fetchReq.predicate = NSPredicate(format: "ANY personchangeposition.time == maxElement(personchangeposition.time)")



        do {

            let fetchResult = try self.appDelegate.managedObjectContext.executeFetchRequest(fetchReqPerson)

            for managedObject in fetchResult {

                var bigTime:PersonChangePosition?


                for changes in (managedObject as! Person).personchangeposition {



                    if (changes as! PersonChangePosition).time.compare(_date) == NSComparisonResult.OrderedAscending {

                        if bigTime == nil {
                            bigTime = changes as! PersonChangePosition
                        } else {

                            if (changes as! PersonChangePosition).time.compare(bigTime!.time) == NSComparisonResult.OrderedDescending {
                                bigTime = changes as! PersonChangePosition;
                            }

                        }

                    }

                }

                if bigTime != nil {
                    //print("bigTime: ",bigTime!.time, "to: ",bigTime!.to)

                    self.fetchResultPerson.append(bigTime!)
                }



            }


            self.fetchForRecord = self.fetchResultPerson;

            //print("fetchResult fetchResultPerson: ",fetchResultPerson.count)


            } catch let fetchError as NSError {

            print("Fetching error: ",fetchError)
            }



            //

            switch(self.areaSegementControl.selectedSegment){


            case 0: self.fetchForRecord = try self.fetchForRecord.filter({$0.to != 4})
            break;

            case 1: self.fetchForRecord = try self.fetchForRecord.filter({$0.to == 1 || $0.to == 3})
            break;

            case 2: self.fetchForRecord = try self.fetchForRecord.filter({$0.to == 2})
            break;

            default:
            break;

            }

但当然,它相当慢......不是很好