基于数组排序NSFetchedResultsController结果?

我想构建一个基于数组内容的NSPredicate或NSSortDescriptor(核心数据搜索)。

该数组将按正确的顺序包含userId:s

 [1, 2, 5, 3]; 

我想以相同的顺序呈现我的NSFetchedResultsController的结果。

所以我会:

  1. 找到合适的用户(我已经这样做了)
  2. 使用userId s根据我的排序数组对用户列表进行排序。

这可能吗,我该怎么做?

我认为这是不可能的。 对获取请求的结果(对于基于SQLite的存储)的排序是在SQLite级别上完成的,并且只能使用存储在数据库中的持久属性。 排序描述符不能使用Objective-C函数或变量。

所以要么

  • 您向实体添加了一个描述预期排序的附加属性(如果可能的话),或者
  • 在获取结果后,您可以根据需要对结果进行排序(这意味着您无法再使用获取的结果控制器进行自动更改跟踪)。 也许你可以使用这里描述的方法: https : //stackoverflow.com/a/15618277/1187415 。

上面的答案并不完全正确。 你可以做你想做的事,但有点复杂。

  1. 在NSNumber上创建一个类别(userID是一个数字,对吧?)
  2. 使用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])]; } 
  3. 将数组设置在某处:

     [NSNumber setOrderingArray:myArrayWithKeys]; 
  4. 使用类型的排序描述符:

     [NSSortDescriptor sortDescriptorWithKey:@"userId" ascending:YES selector @selector(myOwnCompareMethodUsingArray:)] 

这显然适用于具有localizedCaseInsensitiveCompare的字符串:但是,如果它足够大并且覆盖任何fetchLimit / fetchOffset优化,它将降低查询的性能。 请记住,您正在操作的字段必须是唯一的,否则它将全部下地狱。