4

ユーザーのアクティブな一致をすべて表示するメニュー画面を使用して、簡単な単語ゲームを作成しています。この一致の配列を最近アクティブなものから最近アクティブでないものの順に並べ替えたいのですが、プレーヤーが交代で関連付けられるタイムスタンププロパティはGKTurnBasedParticipant...のプロパティのみGKTurnBasedMatchです。有用な並べ替えプロパティはありません。

GKTurnBasedMatchプロパティとしてオブジェクトの配列を持っているGKTurnBasedParticipantので、確かにある種の解決策を思いつくことができますが、本当に厄介で非効率的でないものは考えられません。NSPredicateこのような場合に、参加者の各配列にドリルダウンし、最新のタイムスタンプを確認して、すべての一致を一度に並べ替えるような単純な方法はありますか?

4

2 に答える 2

3

私にはNSPredicateベースのソリューション、またはおそらくあなたが望んでいたほどエレガントなものはありませんが、同じ問題に遭遇し、独自のソリューションを作成しましたが、実際にはそれほど悪くはありませんでした。

私の解決策は、参加者が2人だけのゲームを対象としているため、それに応じて変更しますが、最終的に使用したコードは次のとおりです。

[myGamesArray sortUsingComparator:^NSComparisonResult(CHGame *game1, 
                                                      CHGame *game2) {

    if (YES == [game1 localPlayersTurn] && NO == [game2 localPlayersTurn]) {
        return NSOrderedAscending;
    } else if (NO == [game1 localPlayersTurn] && YES == [game2 localPlayersTurn]) {
        return NSOrderedDescending;
    }

    NSDate *lm1 = [game1.match lastMove];
    NSDate *lm2 = [game2.match lastMove];
    if (lm1 != nil && lm2 != nil) {
        return [lm1 compare:lm2];
    }

    return NSOrderedSame;

}];

ここCHGameで、はゲーム用に作成したカスタムクラス(GKTurnBasedMatch matchプロパティを持つ)であり、インスタンスメソッドは、ローカル参加者の番であるかどうかを示すものをlocalPlayersTurn返します。BOOL

そして、私は次lastMoveのカテゴリのメソッドを作成しましたGKTurnBasedMatch

- (NSDate *)lastMove {
    GKTurnBasedParticipant *localParticipant, *otherParticipant;
    NSDate *lastMove;

    for (GKTurnBasedParticipant *participant in self.participants) {
        if (YES == [participant.playerID isEqualToString:[GKLocalPlayer localPlayer].playerID]) {
            localParticipant = participant;
        } else {
            otherParticipant = participant;
        }
    }

    if (localParticipant == self.currentParticipant) {
        lastMove = otherParticipant.lastTurnDate;
    } else {
        lastMove = localParticipant.lastTurnDate;
    }

    return lastMove;
}

繰り返しになりますが、これは合計2人の参加者に対してのみ機能しますが、任意の数の参加者に対して簡単に変更できます。

それがあなたが求めていたものと正確に一致していなくても、これが役立つことを願っています。

于 2013-03-25T15:36:47.610 に答える
0

現在の参加者の最後のターンでターンベースの試合を並べ替える

[GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray *matches, NSError *error)
 {
     NSString *descriptorKey = @"currentParticipant.lastTurnDate";

     NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:descriptorKey
                                                                      ascending:NO];
     
     NSArray *sortedMatches = [matches sortedArrayUsingDescriptors:@[sortDescriptor]];
 }];



作成された日付でターンベースの一致を並べ替える

[GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray *matches, NSError *error)
 {
     NSString *descriptorKey = @"creationDate";

     NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:descriptorKey
                                                                      ascending:NO];
     
     NSArray *sortedMatches = [matches sortedArrayUsingDescriptors:@[sortDescriptor]];
 }];
于 2013-07-11T05:13:36.830 に答える