我想构建NSPredicate或基于阵列的内容NSSortDescriptor(核心数据搜索)。
该数组将包含userId:s
按照正确的顺序:
[1, 2, 5, 3];
我想目前的结果对于我NSFetchedResultsController以相同的顺序。
所以我会:
- 得到正确的用户(我已经这样做了)
- 用户排序基于我的有序阵列上的列表
userId
秒。
这是可以做到的,我该怎么办呢?
我想构建NSPredicate或基于阵列的内容NSSortDescriptor(核心数据搜索)。
该数组将包含userId:s
按照正确的顺序:
[1, 2, 5, 3];
我想目前的结果对于我NSFetchedResultsController以相同的顺序。
所以我会:
userId
秒。 这是可以做到的,我该怎么办呢?
我认为这是不可能的。 排序为获取请求(用于基于SQLite的商店)的结果是在SQLite的水平上进行,并且只能使用存储在数据库中持久化属性。 排序描述符不能使用的Objective-C函数和变量。
因此,无论
以上答案是不完全正确的。 你可以做你想做的,但它是一个有点复杂。
把NSArray的类型的+全局变量类别上使用objc_setAssoc ....
@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优化。 请记住,你是抗工在球场上必须是唯一的,否则会都去地狱。