Ios 基于数组对NSFetchedResultsController结果排序?
我想构建一个基于数组内容的NSPredicate或NSSortDescriptor(核心数据搜索) 该数组将按正确顺序由Ios 基于数组对NSFetchedResultsController结果排序?,ios,objective-c,cocoa-touch,core-data,nssortdescriptor,Ios,Objective C,Cocoa Touch,Core Data,Nssortdescriptor,我想构建一个基于数组内容的NSPredicate或NSSortDescriptor(核心数据搜索) 该数组将按正确顺序由userId:s组成: [1, 2, 5, 3]; 我想以相同的顺序显示NSFetchedResultsController的结果 因此,我会: 获得正确的用户(我已经这样做了) 根据我用userIds排序的数组对用户列表进行排序 这可能做到吗?我该怎么做?我认为这是不可能的。在SQLite级别对获取请求的结果进行排序(对于基于SQLite的存储),并且只能使用存储在数据库中
userId:s
组成:
[1, 2, 5, 3];
我想以相同的顺序显示NSFetchedResultsController的结果
因此,我会:
userId
s排序的数组对用户列表进行排序这可能做到吗?我该怎么做?我认为这是不可能的。在SQLite级别对获取请求的结果进行排序(对于基于SQLite的存储),并且只能使用存储在数据库中的持久属性。排序描述符不能使用Objective-C函数或变量 所以
- 向实体添加描述预期顺序的附加属性(如果可能),或
- 获取结果后,您可以根据需要对结果进行排序(这意味着您不能再使用获取的结果控制器进行自动更改跟踪)。也许您可以使用此处描述的方法:
- 在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优化,则会降低查询的性能。请记住,您要操作的字段必须是唯一的,否则它将一败涂地。决定添加一个附加属性。谢谢