排序NSFetchedResultsController结果基于阵列?(Sort NSFetched

2019-08-18 09:30发布

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

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

[1, 2, 5, 3];

我想目前的结果对于我NSFetchedResultsController以相同的顺序。

所以我会:

  1. 得到正确的用户(我已经这样做了)
  2. 用户排序基于我的有序阵列上的列表userId秒。

这是可以做到的,我该怎么办呢?

Answer 1:

我认为这是不可能的。 排序为获取请求(用于基于SQLite的商店)的结果是在SQLite的水平上进行,并且只能使用存储在数据库中持久化属性。 排序描述符不能使用的Objective-C函数和变量。

因此,无论

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


Answer 2:

以上答案是不完全正确的。 你可以做你想做的,但它是一个有点复杂。

  1. 上的NSNumber创建类别(用户ID是多少,对吧?)
  2. 把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])]; } 
  3. 某处设置阵列:

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

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

这显然会工作,因为它的工作原理与localizedCaseInsensitiveCompare字符串:但是,如果它足够大,它会降低查询的性能和覆盖任何fetchLimit / fetchOffset优化。 请记住,你是抗工在球场上必须是唯一的,否则会都去地狱。



文章来源: Sort NSFetchedResultsController result based on array?