GameCenter: endTurnWithNext Участники не продвигаются
В среде с песочницей у меня возникают проблемы с переносом матча на основе поворота к следующему игроку.
Первоначальные условия:
- Игрок A и игрок B на устройстве A и устройстве B, соответственно.
- Оба вошли в песочницу
- Оба игрока могут видеть сообщение о статусе GC друг друга
- Игрок A создает матч и приглашает игрока B
- Игрок А заканчивает ход
В своей функции "конец поворота" я делаю следующее:
NSLog(@"size = %ld", updatedMatchData.length);
//move the current player to the bottom of the list
NSMutableArray *nextPlayers = (NSMutableArray *)theMatch.participants;
NSLog(@"%@", [nextPlayers description]);
GKTurnBasedParticipant *firstGuy = nextPlayers[0];
[nextPlayers removeObjectAtIndex:0];
[nextPlayers addObject:firstGuy];
NSLog(@"------");
NSLog(@"%@", [nextPlayers description]);
//send the match to the servers
//"theMatch" was recorded in turnBasedMatchmakerViewController:didFindMatch
[theMatch endTurnWithNextParticipants:nextPlayers
turnTimeout:GKTurnTimeoutDefault
matchData:updatedMatchData
completionHandler:^(NSError *error)
{
if (error)
{
NSLog(@"WTF?");
}
}];
Это приводит к следующему выводу журнала:
size = 26926
(
"<GKTurnBasedParticipant 0x174018630 - playerID:G:1084583147 (local player) status:Active matchOutcome:None lastTurnDate:(null) timeoutDate:(null)>",
"<GKTurnBasedParticipant 0x174018ba0 - playerID:G:12962188 status:Invited matchOutcome:None lastTurnDate:(null) timeoutDate:(null)>"
)
------
(
"<GKTurnBasedParticipant 0x174018ba0 - playerID:G:12962188 status:Invited matchOutcome:None lastTurnDate:(null) timeoutDate:(null)>",
"<GKTurnBasedParticipant 0x174018630 - playerID:G:1084583147 (local player) status:Active matchOutcome:None lastTurnDate:(null) timeoutDate:(null)>"
)
Тем не менее, игрок B не получает приглашение или ход. Игровой центр приложения B игрока не показывает активных игр или ходов. Игровой центр игрока А продолжает показывать, что у него все еще есть ожидающий ход. Каждый раз, когда я перезапускаю и повторяю тест, Игрок А набирает очередной ожидающий ход.
Игрок A увольняет игрока: receiveTurnEventForMatch: didBecomeActive сразу после того, как я закончу ход, но для didBecomeActive установлено значение NO.
Итак, я изменил время ожидания до 30 секунд. Через 30 секунд после того, как игрок A заканчивает ход, игрок A запускает didBecomeActive (нет). PlayerB наконец получает приглашение. Игрок B стреляет didBecomeActive со значением YES.
Почему мой ход не продвигается сразу к игроку B после того, как игрок A заканчивает ход? Почему у игрока А, похоже, есть еще один ход (который затем истекает и передается игроку Б)?
1 ответ
Наконец-то решил это. Не пытайтесь редактировать совпадающий объект. Не редактируйте напрямую matchData или любой другой компонент соответствия. Создайте копию, сделайте все, что вам нужно сделать с копией, и повторно отправьте копию.
Моя попытка сортировать игроков приводила ко многим ошибочным результатам, пока я не создал совершенно отдельный массив участников и не отсортировал его. Тогда это работало как рекламируется.