CoreData:使用 IN 基于谓词/数组进行排序

Posted

技术标签:

【中文标题】CoreData:使用 IN 基于谓词/数组进行排序【英文标题】:CoreData: sort based on predicate/array using IN 【发布时间】:2012-01-13 21:07:34 【问题描述】:

我有一个 CoreData 存储,并希望维护 REST 服务提供的排序顺序。 CoreData 中的对象具有guid 属性,并且对 REST 提供的数组(GUID)进行了排序。从 CoreData 获取对象后,我想保持这种排序。

我在 fetch 中使用以下 NSPredicate

[NSPredicate predicateWithFormat:@"guid IN %@", wishlistGUIDs];

wishlistGUIDs 是 REST 提供的相关对象的 GUID 数组。

有没有办法在保持wishlistGUIDs 顺序的同时获取结果?我已经探索过使用NSSortDescriptor,并通过迭代wishlistGUIDs 来组装一个疯狂的排序描述符数组,但它似乎过于复杂而且只是“错误”。

【问题讨论】:

【参考方案1】:

你能把自己限制在 ios 5/Lion 上吗?这看起来像是有序关系的一个很好的用例(以NSOrderedSet 的形式出现)。您将拥有一个包含有序 GUID 的核心数据实体“愿望清单”。

除此之外,我认为您将不得不做一些丑陋的事情,例如为 GUID 列表维护自己的序列号。

【讨论】:

【参考方案2】:

这是我为解决同一类型问题而采取的额外步骤:

定义方法:

NSInteger gidSort(Guild* num1, Guild* num2, void *context) 
    NSArray* wishlistGUIDs = (NSArray*)context;
    int v1 = [wishlistGUIDs indexOfObject:num1.guid];
    int v2 = [wishlistGUIDs indexOfObject:num2.guid];
    if (v1 < v2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;

那么在你从 fetch 中得到结果之后:

NSArray* resorted = [results sortedArrayUsingFunction:gidSort context:wishlistGUIDs];

【讨论】:

以上是关于CoreData:使用 IN 基于谓词/数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

CoreData fetch 基于谓词添加属性

coredata中谓词的使用

具有长长值的 CoreData 的 iOS 谓词不够精确

在数组控制器上使用谓词过滤相关对象

核心数据 - 使用谓词更好地搜索

CoreData 的谓词查询