そのため、リーダーボード データで有用なことを行うには、まずGKScore
からの配列を取得し、次に各スコアGKLeaderboard
に対応する を取得する必要があります。GKPlayer
playerID
それができたら、プレイヤーをスコアにマッピングしたり、スコアをプレイヤーやs からスコアsにマッピングしたりしたいかもしれませんvalue
。+[NSDictionary dictionaryWithObjects:forKeys:]
すでに配列があるので、 を使用してそのような辞書を設定するとよいでしょう。
問題は、これらの配列が同じ順序であることが保証されているかどうかです。つまり、次のことを行っても安全ですか。
GKLeaderboard *leaderboard = [[GKLeaderboard alloc] init];
[leaderboard loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
NSArray *playerIDs = [scores valueForKey:@"playerID"];
[GKPlayer loadPlayersForIdentifiers:playerIDs withCompletionHandler:^(NSArray *players, NSError *error) {
self.scores = [NSDictionary dictionaryWithObjects:scores forKeys:players];
}];
}];
(簡潔にするために、エラー処理と ARC の安全性は省略されています。)
スコアと同じ順序[scores valueForKey:@"playerID"]
で s の配列が得られることはわかっています。これが、配列で行うべきことです。しかし、取得したプレイヤー スコアの配列が入力と同じ順序になることを、完了ハンドラーは保証するのでしょうか? いくつかのサンドボックス アカウントを作成し、いくつかのテストを行ったところ、並べ替え順序は常に一致しているように見えますが、それは保証されていません。playerID
valueForKey:
loadPlayers
ドキュメントはどちらの方法でも何も言いません。(エラーの場合、配列は部分的な結果を含む可能性があると言っています。その場合、明らかに入力にマップされませんが、エラーのない場合はどうなりますか?) 両方の配列をplayerID
、 of でソートするのは非常に簡単ですもちろん、配列が常に既にソートされている場合、配列のソートに時間を費やさなければならないのは残念です。