我想構建一個基於數組內容的NSPredicate或NSSortDescriptor(核心數據搜索)。基於數組對NSFetchedResultsController結果排序?
數組將包括userId:s
正確的順序:
[1, 2, 5, 3];
我想目前的結果對於我NSFetchedResultsController以相同的順序。
所以我:
- 得到正確的用戶(我已經這樣做了)
- 排序基於我與
userId
小號有序陣列上的用戶列表。
這可能嗎,我該怎麼辦?
我想構建一個基於數組內容的NSPredicate或NSSortDescriptor(核心數據搜索)。基於數組對NSFetchedResultsController結果排序?
數組將包括userId:s
正確的順序:
[1, 2, 5, 3];
我想目前的結果對於我NSFetchedResultsController以相同的順序。
所以我:
userId
小號有序陣列上的用戶列表。這可能嗎,我該怎麼辦?
我認爲這是不可能的。對SQLite級別的存取請求結果進行排序(僅適用於基於SQLite的存儲),並且只能使用存儲在數據庫中的持久性屬性。排序描述符不能使用Objective-C函數或變量。
因此,無論
上述答案並不完全正確。你可以做你想做的事,但它有點複雜。
把+全局變量到使用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])];
}
設置數組的地方:
類型的[NSNumber setOrderingArray:myArrayWithKeys];
使用排序描述:
[NSSortDescriptor sortDescriptorWithKey:@"userId" ascending:YES selector @selector(myOwnCompareMethodUsingArray:)]
這顯然會工作,因爲它適用於字符串與localizedCaseInsensitiveCompare: 但是,如果它足夠大,它會降低查詢的性能和覆蓋任何fetchLimit/fetchOffset優化。請記住,你操作的領域必須是獨一無二的,否則它將全部下地獄。
決定添加一個附加屬性。謝謝! – Anders