我有两个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。但我不知道我可以使用的谓词结构。
有什么想法吗?
答案 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;
}
但当然,它相当慢......不是很好