私には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人の参加者に対してのみ機能しますが、任意の数の参加者に対して簡単に変更できます。
それがあなたが求めていたものと正確に一致していなくても、これが役立つことを願っています。