2012-08-05 4 views
5

Ich sortiere Ergebnisse einer Abrufanforderung mit einem Sortierdeskriptor.Wie sortiert man nicht-englische Strings mit nspredicate?

NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:[MyEntity entityName]]; 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"property" 
                  ascending:YES 
                  selector:@selector(localizedCompare:)]; 
req.sortDescriptors = [NSArray arrayWithObject:descriptor]; 
return [self.managedObjectContext executeFetchRequest:req error:nil]; 

Das Problem sind die Worte, die mit Nicht-Englisch-Zeichen wie ‚I‘ beginnen am Ende der Liste aufgeführt. Es ist ein türkischer Buchstabe und das Alphabet wie folgt aussieht:

A, B, C, C, D, E, F, G, G, H, I, I, J, K, L, M, N, O, Ö, P, R, S, Ş, T, U, Ü, V, Y, Z.

So ist der Brief an der 12. Stelle.

Ich weiß nicht warum, aber Komparator nach dem Abrufen von Objekten funktioniert. Es funktioniert also mit jedem Array, aber nicht mit dem Sortierungsdeskriptor für die Abrufanforderung.

Antwort

3

Werfen Sie einen Blick auf die Details meiner Frage unter NSFetchedResultsController v.s. UILocalizedIndexedCollation Ich zeige, wie die UILocalizedIndexedCollation verwendet wird, um das Alphabet korrekt zu generieren und mit der richtigen Sortiermethode basierend auf UILocalizedIndexCollation zu sortieren. Meine Frage dreht sich nur darum, nach einem besseren Weg zu fragen.

Wenn Sie nicht die UILocalizedIndexCollation verwenden, sollten Sie nur das localizedStandardCompare verwenden: not localizedCompare wie in den WWDC-Videos zur Lokalisierung erwähnt.

1

Versuchen

[NSSortDescriptor alloc] initWithKey:@"property" ascending:YES selector:@selector(localizedCompare:)] 

EDIT

@Mert seine Frage aktualisiert hat. Es scheint nun, dass localizedCompare: die türkischen Buchstaben korrekt sortiert, aber nicht mit der Abrufanforderung funktioniert.

Hier ist, was ich getan habe, um dieses Problem zu testen. Vielleicht können Sie überprüfen, ob die in Ihrer Umgebung funktioniert und dann von dort aus arbeiten:

// Create some entities: 
NSArray *a = @[@"İ", @"J", @"Ğ", @"G", @"H", @"I", @"Ç", @"C"]; 
for (NSString *s in a) { 
    MyEntity *e = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" 
               inManagedObjectContext:self.managedObjectContext]; 
    e.name = s; 
} 

// Fetch all entities in sorted order: 
NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"]; 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" 
                  ascending:YES 
                  selector:@selector(localizedCompare:)]; 
req.sortDescriptors = [NSArray arrayWithObject:descriptor]; 
NSArray *result = [self.managedObjectContext executeFetchRequest:req error:nil]; 

„MyEntity“ ist ein Core Data Einheit mit einem Attribut „name“ vom Typ String.

+0

Es hat nicht funktioniert. Ich habe auch versucht, die Sprache des Simulators zu ändern. – Mert

+0

Das ist seltsam. Wenn ich ein Array mit '[myArray sortedArrayUsingSelector: @selector (localizedCompare :)]' sortiere, bekomme ich korrekte Ergebnisse. Können Sie den Code anzeigen, wie Sie die Abrufanforderung einrichten? –

+0

Ich habe meine Frage bearbeitet und den Code – Mert

0

hatte ich eine ähnliche Probleme mit:

[strArr sortedArrayUsingSelector:@selector(localizedCompare:)]

Es scheint, dass

localizedCompare

Anrufe

compare:other options:nil range:NSMakeRange(0, self.length) locale: [NSLocale currentLocale]];

[NSLocale currentLocale] ist möglicherweise in einem gemischten Zustand, abhängig von den Benutzereinstellungen.Es ist daher erforderlich, um eine saubere NSLocale auf der Grundlage der Benutzer die Sprache

Versuchen Sie, erstellen Sie eine Kategorie auf NSString mit folgendem Inhalt zu erstellen:

-(NSComparisonResult)currentLocalCompare:(id)other 
{ 
    NSLocale * currLoc = [NSLocale currentLocale]; //get current locale 
    NSLocale * loc = [[NSLocale alloc] initWithLocaleIdentifier:currLoc.localeIdentifier];//lets create a new clean NSLocale based on users prefared langauge 
    return [self compare:other options:nil range:NSMakeRange(0, self.length) locale:loc];//compare using clean NSLocale 
} 

und nennen es mag:

[strArr sortedArrayUsingSelector:@selector(currentLocalCompare:)]