使用内部对象的实例variables的值对自定义对象的数组进行sorting

(抱歉,长名称)

我有一个自定义的对象Person,而这个对象又有一个NSSet ,它有几个名为Appointment的自定义对象。 一个人因此可以有几个约会。 约会具有值startTime和endTime。

这些是核心数据NSMangagedObject类。

 @interface Person : NSManagedObject @property (nonatomic, retain) NSString *personName; @property (nonatomic, retain) NSSet *appointments; // etc @end @interface Appointment : NSManagedObject @property (nonatomic, retain) NSNumber * startSecond; @property (nonatomic, retain) NSNumber * endSecond; // etc @end 

我怎样才能得到一个人名单,按照他们的任何约会中最早开始的第二个?

你可以使用sorting描述符和KVC收集操作符:

 NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"appointments.@min.startSecond" ascending:YES]; 

例如,在一个CoreData提取中:

 NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"]; NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"appointments.@min.startSecond" ascending:YES]; [request setSortDescriptors:@[sortDescriptor]]; NSError *error = nil; NSArray *sortedResults = [context executeFetchRequest:request error:&error]; 

或者只是sorting一个数组:

 NSArray *people = @[...]; NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"appointments.@min.startSecond" ascending:YES]; NSArray *sortedPeople = [people sortedArrayUsingDescriptors:@[sortDescriptor]]; 

有关KVC收集操作员的更多信息可以在KVC编程指南中find 。

如果你有一个NSArray格式的数据,你可以像这样sorting:

 NSArray *sortedPersonArray = [coreDataPersonArray sortedArrayUsingSelector:@selector(compare:)]; - (NSComparisonResult)compare:(Person *)personObject { return [self.startSecond compare:personObject.startSecond]; } 

一条build议:

 // Sorting key NSString *key = @"startSecond"; // A mutable array version of your list of Persons. NSMutableArray *a = [NSMutableArray arrayWithObjects:Person1, Person2, Person3, nil]; // Then use the sorted appointements to get your sorted person array. [a sortUsingComparator:^NSComparisonResult(Person *p1, Person *p2) { NSSortDescriptor *sortDesc1 = [NSSortDescriptor sortDescriptorWithKey:key ascending:NO]; NSArray *sortedApp1 = [p1.appointements sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDesc1]]; NSSortDescriptor *sortDesc2 = [NSSortDescriptor sortDescriptorWithKey:key ascending:NO]; NSArray *sortedApp2 = [p2.appointements sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDesc2]]; return [[[sortedApp1 objectAtIndex:0] valueForKey:key] compare:[[sortedApp2 objectAtIndex:0] valueForKey:key]]; }