Псевдоним GameKit GKLocalPlayer в качестве ключа NSDictionary

Я разрабатываю игру для iDevice и хочу сохранить результаты локального игрока на устройстве. Однако локальный игрок может измениться. Например, если в семье есть общий iPad, они могут войти в GameCenter отдельно, прежде чем играть в игру. Чтобы решить эту проблему, я решил хранить локальные результаты в виде словаря, где ключи определяются локальным игроком, а значения представляют собой массивы объектов GKscore.

Моей первой идеей было использовать общий экземпляр GKLocalPlayer в качестве ключа, но, поскольку он не соответствует NSCopying, GKLocalPlayer не является идеальным кандидатом на роль ключа. Моя вторая идея состояла в том, чтобы использовать идентификатор локального проигрывателя, но Apple заявляет: «Не делайте предположений о содержании строки идентификатора проигрывателя. Его формат и длина могут быть изменены». Естественно, я обеспокоен тем, что игрок может потерять свои локальные очки, если его идентификатор игрока однажды волшебным образом изменится.

Моей последней идеей было использовать псевдоним локального игрока. Я подтвердил, что строка псевдонима для неаутентифицированного локального игрока равна nil. Безопасно ли в этом случае использовать [NSNull null] в качестве словарного ключа? Безопасно ли предположить, что псевдоним локального игрока останется неизменным?


person Sam Hertz    schedule 11.02.2013    source источник


Ответы (1)


Единственная вещь в игроке, которая гарантированно будет постоянной, — это строка playerID. Когда он говорит, что формат и длина могут быть изменены, это в контексте попытки интерпретировать контекст строки. Насколько я знаю, дело не в том, что идентификатор конкретного игрока может измениться, а в том, что Apple может генерировать идентификаторы с использованием другой схемы в будущем, поэтому вы не должны зависеть от строки, имеющей какой-либо конкретный формат, или от определенной информации, извлекаемой из строки.

Документы довольно однозначно говорят о том, что это правильный способ сделать это:

Каждой учетной записи игрока в Game Center постоянно назначается уникальная строка идентификатора игрока. Ваша игра должна использовать эту строку для хранения информации о каждом игроке или для устранения неоднозначности между игроками.

person Chuck    schedule 11.02.2013
comment
Спасибо! Я только что нашел этот точный фрагмент в документации самостоятельно минуту назад, но я ценю ответ. Как насчет использования [NSNull null] в качестве словарного ключа? - person Sam Hertz; 11.02.2013
comment
@SamHertz: NSNull идеально подходит в качестве ключа словаря. Единственным ограничением для ключей словаря является то, что они должны быть копируемыми, и NSNull реализует NSCopying. - person Chuck; 11.02.2013