比较Fetchrequest Xcode Swift OSX核心数据的谓词中的NSSet
我有两个比较Fetchrequest Xcode Swift OSX核心数据的谓词中的NSSet,swift,xcode,nspredicate,nsfetchrequest,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
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
的人那里获取一个ChangePosition
。我可以使用哪个谓词结构来完成这个任务?所以我的实际工作流程就是这个
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;
}
但当然,这相当缓慢。。。。不太好