Ios 基于数组对NSFetchedResultsController结果排序?

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的存储),并且只能使用存储在数据库中

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

该数组将按正确顺序由
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优化,则会降低查询的性能。请记住,您要操作的字段必须是唯一的,否则它将一败涂地。

        决定添加一个附加属性。谢谢