gpt4 book ai didi

ios - NSSortDescriptor 未应用于在 iOS 5.1 下获取请求结果(但在 iOS 6+ 下工作正常)

转载 作者:行者123 更新时间:2023-11-29 03:37:02 25 4
gpt4 key购买 nike

我有一个获取请求“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];

结果将被正确排序。

还有人遇到过类似的事情吗?如果有,你找到原因了吗?

谢谢!

卡尔

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;
}

P.P.S.:更多一点上下文,嗯,这次获取的上下文:这是在应用程序启动时发生的,在 1) 后台线程/后台 MOC(具有 NSPrivateQueueConcurrencyType 的嵌套 MOC)服务器信息解析已确定之后一些基本属性,然后 2) 在后台 MOC 中创建一组 Story 实体,其中(除其他)具有所排序的索引,然后 3)在该后台 MOC 上保存更改。只有在这些操作完成后立即执行上述获取请求,并且它是在相同的后台线程和后台 MOC 上执行的。阅读此处:NSSortdescriptor ineffective on fetch result from NSManagedContext —“除非数据一直保存到持久存储,否则如果主上下文中的数据是脏的,即被修改,排序将不起作用”,我尝试在步骤 3) 中强制保存一直“向上” “嵌套的 MOC 链到持久存储(即到磁盘),但这也没有效果:在 iOS 5.1(仅)下,此提取的结果未排序,除非我在执行提取后“手动”对结果进行排序.

最佳答案

好的,经过进一步的实验,我确定,在 iOS 5.1 中确实如此(但在 iOS 6+ 中则不然),如下所述:NSSortdescriptor ineffective on fetch result from NSManagedContext —“除非数据一直保存到持久存储,否则如果主上下文中的数据是脏的(即修改过的),排序将不起作用”。如果我在执行获取请求之前将所有实体更改(插入、修改、删除)保存到持久存储(将嵌套 MOC 链一直执行同步保存到磁盘 MOC),则结果会正确排序。如果我不这样做,那么结果就不会排序。

因此:如果您的应用程序需要在 iOS 5.1 下运行,并且使用嵌套 MOC,则必须 1) 在执行排序的获取请求之前一直“向上”保存到持久存储(例如磁盘),或者2)自己对获取的结果数组应用排序。

(尽管这个问题实际上已经在链接的帖子中得到了解答,但我将把这个问题留在此处并回答,直到/除非要求删除它,因为我认为它更清晰、更明确问题是什么及其解决方案。)

关于ios - NSSortDescriptor 未应用于在 iOS 5.1 下获取请求结果(但在 iOS 6+ 下工作正常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19040588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com