У меня есть запрос на выборку "foo", для которого у меня есть дескриптор сортировки (он сортирует атрибут Integer 16 в порядке убывания). Я выполняю запрос на выборку следующим образом:
__block NSArray *results = nil;
[_managedObjectContext performBlockAndWait:
^{
results = [_managedObjectContext executeFetchRequest:<foo> error:nil];
}];
return results;
Когда я выполняю этот запрос на выборку в iOS 6+, результаты сортируются в соответствии с указанным / ожидаемым (обратный целочисленный порядок индекса).
Однако, когда я выполняю его под iOS 5.1, результаты не отсортированы!
Но если я сразу же применю тот же дескриптор сортировки к массиву результатов следующим образом:
results = [results sortedArrayUsingDescriptors:<foo>.sortDescriptors];
результаты затем сортируются правильно.
Кто-нибудь еще сталкивался с чем-нибудь подобным? Если да, вы узнали причину?
Спасибо!
Карл
P.S .: Если это окажется актуальным, вот определение «foo»:
-(NSFetchRequest *)fetchRequestForUnparsedStoriesOfStoryListWithId:(id)storyListId
{
NSPredicate *hasStoryListWithIdPredicate = [NSPredicate predicateWithFormat:@"ANY lists.id = %@", storyListId];
NSPredicate *isUnparsedStoryOfStoryListWithIdPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[hasStoryListWithIdPredicate, self.isUnparsedPredicate]];
NSFetchRequest *fetchRequestForUnparsedStoriesOfStoryListWithId = [NSFetchRequest fetchRequestWithEntityName:@"Story"];
fetchRequestForUnparsedStoriesOfStoryListWithId.predicate = isUnparsedStoryOfStoryListWithIdPredicate;
fetchRequestForUnparsedStoriesOfStoryListWithId.sortDescriptors = [NSArray arrayWithObject:self.descendingIndexSortDescriptor];
return fetchRequestForUnparsedStoriesOfStoryListWithId;
}
а вот определение дескриптора сортировки:
-(NSSortDescriptor *)descendingIndexSortDescriptor
{
if (! _descendingIndexSortDescriptor)
{
self.descendingIndexSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"index" ascending:NO];
}
return _descendingIndexSortDescriptor;
}
PPS: немного больше контекста, ну, контекста этой выборки: это происходит при запуске приложения, после 1) анализа серверной информации с помощью фонового потока / фонового MOC (вложенный MOC с NSPrivateQueueConcurrencyType) определил некоторые основные свойства , затем 2) создал набор сущностей Story в фоновом MOC, имеющем (inter alia) индекс, по которому выполняется сортировка, а затем 3) сохранил изменения в этом фоновом MOC. Только и сразу же после завершения этих операций выполняется вышеуказанный запрос выборки, и он выполняется в том же фоновом потоке и фоновом MOC. Прочитав здесь: NSSortdescriptor неэффективен при получении результата из NSManagedContext - что «если данные не сохраняются полностью обратно в постоянное хранилище, сортировка не будет работать, если данные в главном контексте загрязнены, т.е. изменены », я попытался принудительно сохранить сохранение на шаге 3) полностью« вверх »по вложенной цепочке MOC в постоянное хранилище (то есть на диск), но это тоже не имело никакого эффекта: в iOS 5.1 (только) результаты этой выборки не сортируются, если я не отсортирую результаты «вручную» после выполнения выборки.