Ordenación de la matriz de objects personalizados utilizando el valor de la variable de instancia de un object interno.

(perdón por el largo título)

Tengo una Persona de object personalizada, que a su vez tiene un NSSet que tiene varios objects personalizados llamados Cita. Por lo tanto, una persona puede tener varias citas. La cita tiene los valores startTime y endTime.

Estas son classs Core Data 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 

¿Cómo obtendré una list de personas, en order de inicio más temprano en segundo lugar dentro de cualquiera de sus citas?

Puede usar descriptores de sorting y operadores de recostackción de KVC:

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

Por ejemplo, en una búsqueda de 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]; 

O simplemente orderando una matriz:

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

Puede encontrar más información sobre los operadores de recolección de KVC en la Guía de progtwigción de KVC .

Si tiene los datos en un formulario NSArray, puede orderarlos de la siguiente manera:

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

Una sugerencia:

 // 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]]; }