Функция делегата GKMatch didStateChange вызывает два раза или отложенный вызов

Я работаю над многопользовательской игрой, и мой матч успешно начался. У меня есть 3 игрока в моем случае. Player1, Player2, Player3. из Player3 я вызываю метод отсоединения объекта GKMatch и мой метод отсоединения

-(void)disocnnectOnlineMatch {
    [self.currOnlineMatch disconnect];
    self.currOnlineMatch.delegate = nil;
    self.currOnlineMatch = nil;
}

на устройствах Player1 и Player2 эта функция didChangeState вызывается в первый раз, а затем через несколько раз вызывается снова для Player3. Ожидается, что он будет вызван только один раз, но его вызов будет 2 раза для обоих игроков.

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state {

}

Любая вещь, которую я делаю, работает? Как лучше отсоединять спичку?

Также иногда это происходит, когда вызывается метод didChangeState, но с определенной задержкой. При этом в игре требуются некоторые обновления отключенного игрока.

Что может быть причиной задержки ответа?

- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match {
    [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
    currOnlineMatch = match;
    currOnlineMatch.delegate = self;
    [PuzzleLogicManager sharedManager].onlineNextRound = 2;
    [self setupRandomNumberToSend:2.0f];
    [presentingViewController dismissViewControllerAnimated:YES completion:^() {
        //NSLog(@"dismissed");
    }];
}

Пожалуйста помоги

заранее спасибо

1 ответ

Решение

Я думаю, что это была ошибка, которая была введена в iOS 6, потому что мы видели это также. Мы не только получим повторные обратные вызовы разъединения, но иногда мы получим обратные вызовы разъединения от игроков, которые на самом деле все еще находятся в игре и перемещаются просто отлично.

Чтобы обойти это, я проверял, действительно ли GKPlayer отключен, когда я получаю обратный вызов отсоединения. Все, что я делаю, это проверяю глобальную копию GKMatch, которую я храню во время игры, и проверяю, есть ли там GKPlayer. Если так, то этот игрок на самом деле не отключился, поэтому я могу проигнорировать сообщение:

NSString    *id;
for (id in gCurrentMatch.playerIDs)
{
   if ([id isEqualToString:playerID])
   {
    NSLog(@"player is NOT really disconnected!!!");
    return;     // just bail and ignore this
   }
}
Другие вопросы по тегам