2012-04-11 34 views
1

Ich versuche, eine Abrufanforderung für eine Entität Ordner auszuführen, und ich möchte einen Ordner mit dem Namen xyz das letzte Objekt sein, wenn sortiert.NSSortDescriptor wird nicht aufgerufen

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"Folder" inManagedObjectContext:appDelegate.managedObjectContext]; 

    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *lastDescriptor = 
    [[[NSSortDescriptor alloc] initWithKey:@"folderName" ascending:YES comparator:^NSComparisonResult(NSString* name1, NSString* name2) { 
     NSLog(@"descriptor"); 
     if ([name1 isEqualToString:@"xyz"]) { 
      return NSOrderedAscending; 
     } 
     if ([name2 isEqualToString:@"xyz"]) { 
      return NSOrderedDescending; 
     } 

     return [name1 compare:name2]; 
    }] autorelease]; 


    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:lastDescriptor]]; 
    [fetchRequest setFetchBatchSize:5]; 

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
    self.fetchedResultsController = theFetchedResultsController; 
    self.fetchedResultsController.delegate=self; 

    [fetchRequest release]; 
    [theFetchedResultsController release]; 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); // Fail 
    } 

Es werden jedoch keine NSLog-Anweisungen aufgerufen. Sollen sie? Und der Ordner xyz erscheint nicht zuletzt, aber alles wird in alphabetischer Reihenfolge sortiert. Mache ich etwas falsch?

Edit: Posted vollständigen Code

+0

meins vielleicht eine dumme Frage, aber sind Sie tatsächlich ausführen die Fetch? dies richtet nur die Art ein. – danh

+0

Nun ja ich bekomme Ergebnisse, sie sind einfach nicht richtig sortiert. Ich erhalte Ergebnisse in alphabetischer Reihenfolge, obwohl dies der einzige Sortierer ist, den ich anrufe. – Snowman

+0

Sollen die NSLog-Anweisungen angezeigt werden? – Snowman

Antwort

1

Dieser Code (Code) funktioniert:

- (void)sortMe { 

    NSDictionary *d0 = [NSDictionary dictionaryWithObject:@"efg" forKey:@"folderName"]; 
    NSDictionary *d1 = [NSDictionary dictionaryWithObject:@"xyz" forKey:@"folderName"]; 
    NSDictionary *d2 = [NSDictionary dictionaryWithObject:@"abc" forKey:@"folderName"]; 
    NSDictionary *d3 = [NSDictionary dictionaryWithObject:@"def" forKey:@"folderName"]; 
    NSArray *testMe = [NSArray arrayWithObjects:d0, d1, d2, d3, nil]; 

    NSSortDescriptor *lastDescriptor = 
    [[NSSortDescriptor alloc] initWithKey:@"folderName" ascending:YES comparator:^NSComparisonResult(NSString* name1, NSString* name2) { 
     NSLog(@"descriptor"); 
     if ([name1 isEqualToString:@"xyz"]) { 
      return NSOrderedAscending; 
     } 
     if ([name2 isEqualToString:@"xyz"]) { 
      return NSOrderedDescending; 
     } 

     return [name1 compare:name2]; 
    }]; 

    NSArray *sorted = [testMe sortedArrayUsingDescriptors:[NSArray arrayWithObject:lastDescriptor]]; 
    for (NSDictionary *d in sorted) { 
     NSLog(@"value=%@", [d valueForKey:@"folderName"]); 
    } 
} 

ich diesen Code vorhersagen, auch funktionieren:

NSError *error; 
NSArray *result = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
// log the array 

denke ich, das Problem befindet sich im NSFetchedResultsController-Delegate-Setup an einer anderen Stelle im Code.

+1

Aufruf Dies ergab ein unsortiertes Array: NSArray * Ergebnis = [appDelegate.managedObjectContext executeFetchRequest: fetchRequest Fehler: & Fehler]; Aber wenn ich dieses Array nach dem gleichen Sortierungsdeskriptor sortiere, funktioniert es. Es hat etwas mit den Abrufanforderungen zu tun, die den Sortierungsdeskriptor nicht anwenden. Wo sollte ich anfangen, das zu beheben? – Snowman