2016-05-05 6 views
0

Ich habe ein Array, das einige Kerndatenobjekte enthält. Jedes Objekt hat drei Attribute sagen „First Name“ & „Last NameSortieren NSArray mit mehreren Prädikaten in Objective C

I & sortieren das Array nach dem Suchbuchstabe (n) filtern möchten. Die endgültige Liste sollte in dieser Reihenfolge:

  • Datensätze, die mit Vornamen wie wie gesuchten Text beginnen soll
  • Aufzeichnungen zuerst kommen, der mit Nachnamen wie wie gesuchten Text beginnt soll
  • Aufzeichnungen zweite kommen, die enthalten Vorname als wie gesuchter Text sollte dritte
  • Aufzeichnungen kommen, die Nachnamen wie wie gesuchten Text enthält, sollte

vierten kommen verwirrte ich in Prädikate zu schaffen und zu sortieren descri Ptors. Kann jemand helfen?

Edit:

Hier ist meine abgerufenen Ergebnisse Controller:

-(NSFetchedResultsController *)myFetchedResultsController 
{ 
    if (!_myFetchedResultsController) 
    { 
     ... 
     ... 

     NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:MY_ENTITY_NAME]; 

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(firstName beginswith[cd] %@) || (lastName beginswith[cd] %@) || (firstName contains[cd] %@) || (lastName contains[cd] %@))", self.searchText, self.searchText, self.searchText, self.searchText]; 

     [fetchRequest setPredicate:predicate]; 


     //I really dont have idea about how to set sort description to this scenario 

     NSSortDescriptor *firstNameDescriptors = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; 
     NSSortDescriptor *lastNameDescriptors = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; 

     [fetchRequest setSortDescriptors:@[firstNameDescriptors, lastNameDescriptors]]; 

     _userFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
    } 

    return _myFetchedResultsController; 
} 

Aber das scheint nicht funktioniert, bedeutet es nicht, die Objekte nicht sortieren.

+0

Könnten Sie bitte zeigen, was Sie versucht haben und wo Sie mit dem Problem konfrontiert sind? –

Antwort

1

Aber das scheint nicht funktioniert, bedeutet, dass es die Objekte nicht sortiert.

Meinst du wirklich, dass es nicht sortiert, oder dass es nicht so sortiert, wie du es wünschst?

NSSortDescriptor braucht einen einzigen Schlüssel zum Sortieren. In einer Situation, in der Sie einen Primärschlüssel und einen Sekundärschlüssel haben, bei dem Sie den Sekundärschlüssel nur dann sortieren, wenn die Primärschlüssel gleich sind, z. Familienname dann gegebener Name, dann existieren Routinen wie die setSortDescriptors:, die ein Array von Sortierdeskriptoren benötigen. Dies ist die Art der Sortierung, die Sie in Ihrem Code eingerichtet haben.

Dies ist jedoch nicht die Art der Art, die Sie in Ihren Aufzählungszeichen angegeben haben. Ihre Sortierung erfordert Zugriff auf mehrere Schlüssel, um die Reihenfolge zu bestimmen - es besagt, dass der erste Schlüssel eine bestimmte Bedingung erfüllt, dann nach diesem Schlüssel sortiert, andernfalls, wenn der zweite Schlüssel eine bestimmte Bedingung erfüllt, dann nach diesem Schlüssel usw. sortiert wird Sortieren Sie können einen NSComparator Block schreiben, der Zugriff auf die vollständigen Objekte hat - nicht nur die Werte eines bestimmten Schlüssels - und Ihren Algorithmus als eine Kombination aus Tests und Vergleichen implementieren.

Leider wird diese zweite Sortierart nicht direkt von NSFetchRequest unterstützt. Stattdessen müssen Sie die Ergebnisse ohne Sortieren erhalten und dann das resultierende Array mit einer Methode wie sortedArrayUsingComparator: sortieren.

Für eine verwandte Frage siehe NSSortDescriptor: Custom comparison on multiple keys simultaneously.

HTH