Отправка псевдонима игрока (Game Center) через структуру с помощью ARC - PullRequest
0 голосов
/ 13 февраля 2012

Каков наилучший подход для отправки псевдонима локального проигрывателя (или любого другого текста) на другое устройство, поскольку я не могу вставить строку NSString в свою структуру из-за ARC / указателей?

До сих пор я пытался преобразовать массив в и из массива char, используя опцию __unsafe_unretained-, и пытался создать класс для вставки текста. Хотя все три из этих попыток работали через компиляцию, они потерпели крахустройство (симулятор продолжает работать, но псевдоним не отображается.)

Действительно ли сложно отправлять текст в многопользовательских играх при использовании ARC?Проблемы, с которыми я сталкиваюсь, скорее всего, являются следствием того факта, что я не очень опытен в программировании ... поэтому, если кто-то может указать мне верное направление или предоставить мне некоторые фрагменты кода, я был бы очень признателен.

1 Ответ

1 голос
/ 11 апреля 2012

Вы можете легко кодировать и декодировать строки в объекты NSData и отправлять их через Game Center.

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

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

С кодировкой: NSUTF8StringEncoding

Это вернет объект NSData

Для декодирования;

NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

Edit:

По сути, вам никогда не придется отправлять псевдонимы игроков явно. Есть 2 случая:

1: GKTurnBasedMatch

Если вы используете это, то вот как получить список всех псевдонимов (включая ваш)

NSMutableArray *playerIds = [NSMutableArray arrayWithCapacity:match.participants.count];

for (GKTurnBasedParticipant *part in match.participants) {

if([participant.playerID isKindOfClass:[NSString class]]){
                [playerIds addObject:part.playerID];
            }
 } //at this point you have an array full of playerID strings, next you call this:

[GKPlayer loadPlayersForIdentifiers:(NSArray *)playerIds withCompletionHandler:(void (^)      (NSArray *players, NSError *error))completionHandler {

for (GKPlayer *playa in players) {

NSLog(@"%@",playa.alias); // here i'm just logging the aliases but you can do whatever..
}


}];

2.GKMatch: этот случай намного проще, так как ваш GKMatch уже имеет массив playerIDs, такой же, как прежде:

[GKPlayer loadPlayersForIdentifiers:(NSArray *) match.playerIDs withCompletionHandler:(void (^)(NSArray *players, NSError *error))completionHandler {

//again you get the array players full of GKPlayer objects , simply pull the alias you want

}];
...