基于数组排序NSFetchedResultsController结果?

时间:2013-03-31 12:39:36

标签: ios objective-c cocoa-touch core-data nssortdescriptor

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

数组将按正确的顺序由userId:s组成:

[1, 2, 5, 3];

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

所以我会:

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

    这可能吗,我该怎么做?

2 个答案:

答案 0 :(得分:3)

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

所以要么

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

答案 1 :(得分:0)

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

  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:)]
    
  5. 这显然适用于使用localizedCaseInsensitiveCompare的字符串: 但是,如果查询的大小足以覆盖任何fetchLimit / fetchOffset优化,它将降低查询的性能。请记住,您正在操作的字段必须是唯一的,否则它将全部下地狱。