GKMatch委托函数didStateChange调用两次或延迟调用

时间:2013-09-26 07:11:38

标签: game-center gkmatchmaker

我正在开展多人游戏,我的比赛已成功启动。在我的情况下,我有3名球员。 Player1,Player2,Player3。 从Player3,我调用GKMatch对象的disconnect方法,我的断开方法是

-(void)disocnnectOnlineMatch {
    [self.currOnlineMatch disconnect];
    self.currOnlineMatch.delegate = nil;
    self.currOnlineMatch = nil;
}
在Player1和Player2设备上的

这个didChangeState函数是第一次被调用,而不是在一些时候再次为Player3调用它。预计只会被召唤一次,但是两个球员的召唤次数为

- (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 个答案:

答案 0 :(得分:0)

我认为这是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
   }
}