我有一个获取请求“foo”,上面有一个排序描述符(它按降序对整数 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];
然后对结果进行正确排序。
有没有其他人遇到过这样的事情?如果有,您发现原因了吗?
谢谢!
卡尔
PS:如果证明相关,这里是“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(具有 NSPrivateQueueConcurrencyType 的嵌套 MOC)解析确定了一些基本属性之后,然后 2) 在后台 MOC 中创建一组 Story 实体,其中包含(除其他外)被排序的索引,然后 3) 保存该背景 MOC 上的更改。只有在这些操作完成后,才会立即执行上述获取请求,并且在相同的后台线程和后台 MOC 上执行。读到这里:NSSortdescriptor ineffective on fetch result from NSManagedContext—“除非数据一直保存回持久存储,否则如果主上下文中的数据是脏的,即已修改,则排序将不起作用”,我尝试在步骤 3)中强制保存一直“向上” " 到持久存储(即磁盘)的嵌套 MOC 链,但这也没有效果:在 iOS 5.1 下(仅)此提取的结果未排序,除非我在执行提取后“手动”对结果进行排序.