2013-03-31 142 views
3

我想构建一个基于数组内容的NSPredicate或NSSortDescriptor(核心数据搜索)。基于数组对NSFetchedResultsController结果排序?

数组将包括userId:s正确的顺序:

[1, 2, 5, 3]; 

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

所以我:

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

这可能吗,我该怎么办?

回答

3

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

因此,无论

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

决定添加一个附加属性。谢谢! – Anders

0

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

  1. 创建上的NSNumber类别(用户ID是多少,对吧?)的NSArray类型的
  2. 把+全局变量到使用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优化。请记住,你操作的领域必须是独一无二的,否则它将全部下地狱。