我想构建一个基于数组内容的NSPredicate或NSSortDescriptor(核心数据搜索)。基于数组对NSFetchedResultsController结果排序?
数组将包括userId:s
正确的顺序:
[1, 2, 5, 3];
我想目前的结果对于我NSFetchedResultsController以相同的顺序。
所以我:
- 得到正确的用户(我已经这样做了)
- 排序基于我与
userId
小号有序阵列上的用户列表。
这可能吗,我该怎么办?
我想构建一个基于数组内容的NSPredicate或NSSortDescriptor(核心数据搜索)。基于数组对NSFetchedResultsController结果排序?
数组将包括userId:s
正确的顺序:
[1, 2, 5, 3];
我想目前的结果对于我NSFetchedResultsController以相同的顺序。
所以我:
userId
小号有序阵列上的用户列表。这可能吗,我该怎么办?
我认为这是不可能的。对SQLite级别的存取请求结果进行排序(仅适用于基于SQLite的存储),并且只能使用存储在数据库中的持久性属性。排序描述符不能使用Objective-C函数或变量。
因此,无论
上述答案并不完全正确。你可以做你想做的事,但它有点复杂。
把+全局变量到使用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优化。请记住,你操作的领域必须是独一无二的,否则它将全部下地狱。
决定添加一个附加属性。谢谢! – Anders