上記の答えは正確には当てはまりません。やりたいことはできますが、少し複雑です。
- 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 の最適化を無効にすると、クエリのパフォーマンスが低下します。操作しているフィールドは一意である必要があることを忘れないでください。そうしないと、すべてが地獄に落ちます。