Таким образом, чтобы сделать что-то полезное с данными таблицы лидеров, нужно сначала получить массив GKScore
s из GKLeaderboard
, а затем получить соответствующие GKPlayer
s для каждого результата.
Когда у вас это есть, вы можете захотеть иметь словарь, отображающий игроков на очки или очки на игроков, или playerID
s на value
s, или что-то в этом роде. И было бы неплохо настроить такой словарь с помощью +[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"]
даст мне массив из playerID
в том же порядке, что и баллы — это то, что должен делать valueForKey:
в массиве. Но гарантирует ли обработчик завершения из loadPlayers
, что массив полученных результатов игроков будет в том же порядке, что и входные данные? Я создал несколько учетных записей песочницы и провел несколько тестов, и оказалось, что порядок сортировки всегда совпадает, но это не гарантия.
Документация ни о чем не говорит. (Он говорит, что массив может содержать частичные результаты в случае ошибки, и в этом случае он, очевидно, не будет отображаться на входе, но как насчет случая без ошибок?) Довольно просто отсортировать оба массива по playerID
, конечно, но было бы обидно тратить время на сортировку массива, если он всегда будет уже отсортирован.