2016-08-11 36 views
1

我有两个NSManagedObject像谓词比较NSSet中的Fetchrequest的XCode斯威夫特OSX核心数据

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。但我不知道这可以用于这个结构。

有什么想法?

回答

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; 

      } 

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