1

Core Dataを使用してストレージからデータを取得NSFetchRequestし、そのデータを に保存していますarray- すべてうまくいきます。次のステップとして、次のようarrayに並べ替えたいと思います。NSSortDescriptors

array = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:
            [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO],
            [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO comparator:^NSComparisonResult(id obj1, id obj2) {
                    if ([[[array objectAtIndex:[obj2 integerValue]] valueForKey:@"lessImportantItems"] containsObject:[array objectAtIndex:[obj1 integerValue]]]) {
                        return (NSComparisonResult)NSOrderedAscending;
                    } else {
                        return (NSComparisonResult)NSOrderedDescending;
                    }
                }],
            [NSSortDescriptor sortDescriptorWithKey:@"createdAt" ascending:NO], nil]];

私が抱えている問題はNSComparator、2 番目のブロックがNSSortDescriptor呼び出されないことです (しようとしましたNSLog)。私のデータ構造の背景を説明するために、関連するCore Dataオブジェクト グラフのセクションを次に示します。

http://screencast.com/t/AOY6IdNFWoK

アプリケーションが行うことは、アイテムを互いに比較することです。最初のステップとして、一対比較の勝者がscoreインクリメントを取得します。lessImportantItemsしかし、ペアの優先順位もマークします。つまり、勝者から敗者への1 対多の関係を追加します。したがって、私の配列では、最初に で並べ替えようとしscore、次にscores が等しい場合、ペアの優先度で並べ替えを試みます。

scoreコンパレーターkeyを2回続けて使用しているからでしょうか?しかし、一方、a をいずれかとして渡すNSComparatorことはできません。relationshipkey

私はこれを割ることができないようです。誰にもアイデアはありますか?それとも、ソートに別のアプローチをとるべきでしょうか?

4

2 に答える 2

0

誰かが興味を持っているなら、これが私が求めていたソートをどのように達成したかです。

NSSortDescriptor上記の例の最初のものだけを使用して、array並べ替えを取得しscore、さらに並べ替えメソッドを呼び出しましたarray

array = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:
            [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO], nil];

array = [self applyMoreImportantPairOrdering:array];

そして、ここに方法があります:

+ (NSArray *)applyMoreImportantPairOrdering:(NSArray *)array {

    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];

    [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        if ([[obj valueForKey:@"score"] integerValue] > 0) {

            NSMutableSet *lessImportantItemsSet = [NSMutableSet setWithSet:[obj valueForKey:@"lessImportantItems"]];

            for (int i = idx - 1; i >= 0; i--) {

                NSManagedObject *objAbove = [array objectAtIndex:i];

                if ([[obj valueForKey:@"score"] integerValue] == [[objAbove valueForKey:@"score"] integerValue]) {

                    if ([lessImportantItemsSet containsObject:objAbove]) {

                        NSUInteger idxAbove = [mutableArray indexOfObject:objAbove];

                        [mutableArray removeObject:obj];
                        [mutableArray insertObject:obj atIndex:idxAbove];
                    }
                }
            }
        }
    }];

    return [NSArray arrayWithArray:mutableArray];
}

が必要な理由lessImportantItemsSetは、 を に移動 (削除して挿入) すると、その関係が失わitemれるためです。これにより、特定の.arraylessImportantItemsitemitem

于 2013-08-27T15:41:11.590 に答える