我想构建一个基于数组内容的NSPredicate或NSSortDescriptor(核心数据搜索)。
数组将按正确的顺序由userId:s
组成:
[1, 2, 5, 3];
我想以相同的顺序呈现NSFetchedResultsController的结果。
所以我会:
userId
s。这可能吗,我该怎么做?
答案 0 :(得分:3)
我认为这是不可能的。对提取请求(对于基于SQLite的存储)的结果进行排序是在SQLite级别上完成的,并且只能使用存储在数据库中的持久属性。排序描述符不能使用Objective-C函数或变量。
所以要么
答案 1 :(得分:0)
上述答案并非完全正确。你可以做你想做的事,但这有点复杂。
使用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优化,它将降低查询的性能。请记住,您正在操作的字段必须是唯一的,否则它将全部下地狱。