2013-03-31 182 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優化。請記住,你操作的領域必須是獨一無二的,否則它將全部下地獄。