1

私はNSFetchRequest次の述語でを行っています:

[NSPredicate predicateWithFormat:@"index IN %@", indexes];

...ここindexesで、NSOrderedSetは数字です。

これにより、指定されたインデックスを持つ「ランダムにソートされた」オブジェクトの配列が得られます。オブジェクトが順序セットと同じ順序で表示されるように、これを並べ替える必要があります。

これを行うための最も効率的な方法は何でしょうか?

アップデート

マーティンRの回答に基づくカテゴリは次のとおりです。

@implementation NSArray (SortUsingValues)

- (NSArray *)sortedArrayUsingValues:(NSOrderedSet *)values keyPath:(NSString *)keyPath
{
    NSAssert([values isKindOfClass:[NSOrderedSet class]], nil);
    NSAssert([keyPath isKindOfClass:[NSString class]], nil);
    return [self sortedArrayUsingComparator:^NSComparisonResult(id object, id otherObject) {
        id value = [object valueForKeyPath:keyPath];
        id otherValue = [otherObject valueForKeyPath:keyPath];
        NSUInteger indexOfValue = [values indexOfObject:value];
        NSUInteger indexOfOtherValue = [values indexOfObject:otherValue];
        if (indexOfValue > indexOfOtherValue) return NSOrderedDescending;
        else if (indexOfValue < indexOfOtherValue) return NSOrderedAscending;
        else return NSOrderedSame;
    }];
}

@end
4

1 に答える 1

1

その目的でフェッチ要求でソート記述子を使用する方法を考えることはできません。ただし、インデックスに従ってフェッチした後、結果の配列を並べ替えることができます。

NSArray *sorted = [results sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSUInteger idx1 = [indexes indexOfObject:[obj1 valueForKey:@"index"]];
    NSUInteger idx2 = [indexes indexOfObject:[obj2 valueForKey:@"index"]];
    return idx1 - idx2;
}];
于 2013-03-25T15:08:59.270 に答える