5

サードパーティからの ID でいっぱいのフィールドがあります。ID は数値ですが、DB には文字列として書き込まれます。

整数の値で、この ID でソートされたフェッチをソートしたいと考えています。だから私はこれNSSortDescriptorをに追加していNSFetchRequestます。

NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];
[numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:@"someId" ascending:YES comparator:^(id a, id b) {
    return [[numFormatter numberFromString:a] compare:[numFormatter numberFromString:b]];
}];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortBy]];

しかし、次のような結果が得られます。これらは文字列としてアルファベット順にソートされます。

730275292
73900038
730172867
7350727
830138437
835164
837287901
8338804
930274
9324376

このコンパレータ ブロックの使用について理解していないことは何ですか?

編集 2012 年 5 月 1 日午前 9 時 20 分 EST

比較ブロックが使用されているかどうかをテストするために、フィールドの長さに基づいて次のように並べ替えを試みました。

NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:@"fbId" ascending:YES comparator:^(id a, id b) {
    if ([a length] < [b length]) {
        return NSOrderedAscending;
    } else if ([a length] > [b length]) {
        return NSOrderedDescending;
    } else {
        return NSOrderedSame;
    }
}];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortBy]];

私はまだアルファベット順にソートされた結果を取得しています! これは、コンパレータブロックが使用されていないと私に思わせます。

716164250
726354466
73900038
739600038
7450727
810138437
801164
801375346
8213997
4

2 に答える 2

1

私は NSFetchRequest を使用していないので、具体的にコメントすることはできませんが、それに関連しているようです。コンパレータ ブロックで使用するコードは問題ありません。表示された正確な数値の配列をセットアップし、コードを使用してそれらを並べ替えたところ、すべてうまくいきました。

    NSArray *array = [NSArray arrayWithObjects:@"730275292",
                      @"73900038",
                      @"730172867",
                      @"7350727",
                      @"830138437",
                      @"835164",
                      @"837287901",
                      @"8338804",
                      @"930274",
                      @"9324376", nil];
    NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];
    [numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    NSArray *sArray = [array sortedArrayUsingComparator:^(id a, id b) {
        return [[numFormatter numberFromString:a] compare:[numFormatter numberFromString:b]];
    }];
    NSLog(@"%@",sArray);

上記のコードを実行すると、次のログが取得されます。

(
    835164,
    930274,
    7350727,
    8338804,
    9324376,
    73900038,
    730172867,
    730275292,
    830138437,
    837287901
)

これがあなたが探している順序だと思います。フェッチ リクエストの結果を取得し、それらを受け取った後に配列に並べ替えることを検討してください。配列がソートを行うのか、フェッチ要求がソートを行うのかは問題ではないと思います。ほとんどの場合、どちらを使用してもパフォーマンスが向上することはありません。

それでも NSFetchRequest に並べ替えを実行させたい場合は、適切に並べ替えるために何か不足している可能性があります。正直、使っていないのでわかりません。

アップデート

NSFetchRequest のドキュメントをざっと見てみると、並べ替えに影響するパラメーターがいくつかあることがわかりました。たとえば、のドキュメントでは、resultType次のメッセージが表示されます。

setResultType: を使用して、リクエストの実行から返されるオブジェクトのインスタンス タイプを設定します。可能な値については、「NSFetchRequestResultType」を参照してください。値を NSManagedObjectIDResultType に設定すると、リクエストにプロパティ値を含めないと、ソート順序が「ベスト エフォート」ヒントに格下げされます。

そのため、戻り値の型が並べ替えに影響を与えているように見えます。

于 2012-05-01T13:50:21.697 に答える