【问题标题】:Sort NSFetchedResultsController result based on array?根据数组对 NSFetchedResultsController 结果进行排序?
【发布时间】:2014-12-02 07:49:39
【问题描述】:
我想构造一个基于数组内容的 NSPredicate 或 NSSortDescriptor(核心数据搜索)。
数组将按正确的顺序由userId:s 组成:
[1, 2, 5, 3];
我想以相同的顺序显示我的 NSFetchedResultsController 的结果。
所以我会:
- 获取合适的用户(我已经这样做了)
- 使用
userIds 根据我的排序数组对用户列表进行排序。
这可能吗,我该怎么做?
【问题讨论】:
标签:
ios
objective-c
cocoa-touch
core-data
nssortdescriptor
【解决方案1】:
我认为这是不可能的。对获取请求的结果(对于基于 SQLite 的存储)进行排序是在 SQLite 级别上完成的,并且只能使用存储在数据库中的持久属性。排序描述符不能使用 Objective-C 函数或变量。
要么
【解决方案2】:
上述答案并不完全正确。你可以为所欲为,但有点复杂。
- 在 NSNumber 上创建一个类别(userID 是一个数字,对吗?)
-
使用 objc_setAssoc.. 将一个 NSArray 类型的 + 全局变量放到类别中......
@interface NSNumber(MyExtension)
+ (NSArray *) orderingArray;
+ (void) setOrderingArray: (NSArray *)array;
- (NSComparisonResult) myOwnCompareMethodUsingArray:(NSNumber *)theOtherNumber;
@end
int keyVar = 0;
@implementation NSNumber(MyExtension)
+ (NSArray *) orderingArray
{
return objc_getAssociatedObject(self, &keyVal);
}
+ (void) setOrderingArray: (NSArray *)array
{
objc_setAssociatedObject(self, &keyVal, array, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSComparisonResult) myOwnCompareMethodUsingArray:(NSNumber *)theOtherNumber;
{
NSArray *a = [self.class orderingArray];
if(!a) return NSOrderedSame;
return [@([a indexOfObject:self]) compare: @([a indexOfObject:theOtherNumber])];
}
-
在某处设置数组:
[NSNumber setOrderingArray:myArrayWithKeys];
-
使用类型的排序描述符:
[NSSortDescriptor sortDescriptorWithKey:@"userId" ascending:YES selector @selector(myOwnCompareMethodUsingArray:)]
这显然适用于具有localizedCaseInsensitiveCompare 的字符串:
但是,如果它足够大并覆盖任何 fetchLimit/fetchOffset 优化,它将降低查询的性能。请记住,您所操作的字段必须是唯一的,否则一切都将一败涂地。