1

多対 1 の順序付けされた CoreData 関係でオブジェクトを置き換えようとしています...私のコードは次のとおりです。

NSMutableOrderedSet *battingLineUpTemp = [battingOrderToChange.battingOrder mutableCopy];
    NSUInteger newBatsmanIndex = 0;

NSLog(@"Original batting order");
for (CricketPlayer *p in battingLineUpTemp) {
    NSLog(@"switching : %@ %@",p.firstName, p.lastName);
}

for (int i = [innings.wicketsFallen integerValue] +2; i < [battingOrderToChange.battingOrder count]; i++) {

    //[battingLineUpTemp replaceObjectAtIndex:i withObject:batsmenArray[newBatsmanIndex]];
    [battingLineUpTemp replaceObjectAtIndex:i withObject:[batsmenArray objectAtIndex:newBatsmanIndex]];
    newBatsmanIndex++;

}

NSLog(@"Changed batting order");
for (CricketPlayer *p in battingLineUpTemp) {
    NSLog(@"switching : %@ %@",p.firstName, p.lastName);
}


[battingOrderToChange willChangeValueForKey:@"battingOrder"];
[battingOrderToChange setBattingOrder:[[NSOrderedSet alloc] initWithOrderedSet:[battingLineUpTemp copy]]];
battingOrderToChange.battingOrder = battingLineUpTemp;
[battingOrderToChange didChangeValueForKey:@"battingOrder"];

それでも、2回目にプレイヤー名を出力すると、以前とまったく同じ結果が得られます! メソッドに渡す NSArray (batsmenArray) が *battingLineUpTemp と同じ順序ではないことを確認しました...この NSMutableOrderedSet の順序を変更することをコードが拒否しているのはなぜですか!? CoreData が再びお尻に大きな苦痛を与えているのでしょうか?

編集 1 また、for ループ内の NSLogging によって、置き換えているオブジェクトと置き換えているオブジェクトが異なることを確認しました... NSMutableOrderedSet は単に再配置を拒否しています!

4

1 に答える 1

0

サイモン・タンパー

順序付きセットには多くの用途がありますが、主に挿入順序を保持するためのメカニズムです。ラインナップの順序を変更したい場合は、実際にプロパティを追加してラインナップ内の位置を含め、その順序で並べ替えることをお勧めします。(これをプロパティとして使用して、ラインナップ プロパティでゼロ以外の値をチェックすることで、名簿からラインナップを簡単に引き出すこともできます。)

アンドリュー

于 2013-06-24T12:49:20.047 に答える