NSSortdescriptor jest nieskuteczny na wynik pobierania z NSManagedContext

Usiłuję posortować mój wynik NSFetchRequest przy użyciu NSSortdescriptor przy użyciu klucza wskazującego wartość NSDate. Moje wyniki pobierania są całkowicie losowe bez wyraźnego powodu.

Używany NSManagedObjectContext jest aktualizowany za pomocą zapisu z zagnieżdżonego kontekstu potomnego utworzonego na podklasie NSOperation. Wiem, że wszystko to zostało wykonane pomyślnie, ponieważ mogę uzyskać wszystkie potrzebne dane z kontekstu macierzystego (głównego). Pobieranie z niego nie posortuje daty!

Dziwna rzecz; predykaty wyboru jednostek (zwanych „Tweetiem”) między dwiema datami działają dobrze!

Oto kod ilustrujący mój problem:

<code>NSSortDescriptor* timeDescriptor = [NSSortDescriptor
                                        sortDescriptorWithKey:@"time"
                                        ascending:NO
                                        selector:@selector(compare:)];

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Tweet"];
[request setSortDescriptors:[NSArray arrayWithObjects:timeDescriptor, nil]];

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"((time >= %@) AND (time <= %@))",startDate,endDate];
[request setPredicate:predicate];

NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:[[NSApp delegate] managedObjectContext]];
[context performBlock:^{
    NSError* error = nil;
    NSArray* results = nil;

    results = [context executeFetchRequest:request error:&error];
    // Results here are not ordered correctly

    // 2nd try sorting results using fetched array (works!)
    results = [results sortedArrayUsingDescriptors:[NSArray arrayWithObjects:timeDescriptor, nil]];

    // This works too but not needed anymore
    /*results = [results sortedArrayUsingComparator:^(id obj1, id obj2) {
        Tweet* tweet1 = (Tweet*)obj1;
        Tweet* tweet2 = (Tweet*)obj2;
        //return [tweet1.time compare:tweet2.time]; // ascending
        return [tweet2.time compare:tweet1.time]; // descending
    }];*/

    if ([results count] > 0) {
        for (uint i = 0; i < [results count]; i++) {
            Tweet* tweet = [results objectAtIndex:i];
            NSDate* date = Tweet.time;
            NSLog(@"tweet date: %@", date);
        }
    }
}];
</code>

Czy ktoś może mi powiedzieć, dlaczego NSSortDescriptor nie działa dla moich pobrań?

Dzięki!

-- Aktualizacja --

Wydaje się, że NSSortDescriptor działa dobrze, gdy pobieram z głównego (macierzystego) managedObjectContext w głównym wątku bez użycia metody performBlock. To wciąż nie pomaga mi w sortowaniu pobrań w NSPrivateQueueConcurrencyType managedObjectContext. Tworzenie NSFetchRequest, NSSortDescriptor i NSPredicate wewnątrz performBlock również nie rozwiązuje problemu.

questionAnswers(3)

yourAnswerToTheQuestion