GKTurnBasedMatch - 未为CurrentParticipant

时间:2018-05-21 08:54:59

标签: game-center gkturnbasedmatch

所以我已经在这几个星期了,从来没有在网上的任何地方找到答案。源代码注释,各种文档和各种来源声称,当交换的所有收件人回复或超时时,应该调用函数ReceivedExchangeReplies(GKPlayer, GKTurnBasedExchangeReply[], GKTurnBasedExchange, GKTurnBasedMatch)。应该为交易所的发起人和当前的参与者都要求它。

但在我的应用程序中,它只会被要求交换的发起者,而不是转换者。我无法继续我的编码,因为当前的转换器应该在完成后合并并解决交换。但它不能这样做,因为它永远不会得到关于交换完成的通知。

AuthenticationHandler 正常运行,并不关心问题:

func authenticateLocalPlayer() {
    let localPlayer: GKLocalPlayer = GKLocalPlayer.localPlayer()
    localPlayer.authenticateHandler = {(ViewController, error) -> Void in
        if((ViewController) != nil) {
            self.underlyingViewController.present(ViewController!, animated: true, completion: nil)
        } else if (localPlayer.isAuthenticated) {
            self.gamecenterEnabled = true
            localPlayer.unregisterAllListeners()
            localPlayer.register(self)
            self.findBattleMatch()
        } else {
            self.gamecenterEnabled = false
            print(error as Any)
        }
    }
}

以下是 Exchange请求的发送方式:

currentMatch.sendExchange(to: [nextParticipant], data: GameState.encodeStruct(structToEncode: structToSend), localizableMessageKey: messageKey, arguments: ["X","Y"], timeout: TimeInterval(timeOutDebug), completionHandler: {(exchangeReq: GKTurnBasedExchange?,error: Error?) -> Void in
    if(error == nil ) {
        print("Operation successfull")
    } else {
        print(error as Any)
    }
})

回复回复

exchange.reply(withLocalizableMessageKey: exchange.message! , arguments: ["XY","Y"], data: GameState.encodeStruct(structToEncode: exchangeReply), completionHandler: {(error: Error?) -> Void in
    if(error == nil ) {
        print("ExchangeReply sent successfully")
    } else {
        print(error as Any)
    }
})

在交换后 完成 之后,应自动调用以下覆盖函数 。对于 交换 发起人 strong>对于 当前的持有者

func player(_ player: GKPlayer, receivedExchangeReplies replies: [GKTurnBasedExchangeReply], forCompletedExchange exchange: GKTurnBasedExchange, for match: GKTurnBasedMatch){
    print("Exchange was completed, turnholder and Exchange-initiator should act on that in following code.")
    ...code...
}

这是上面提到的ObjectiveC函数的Swift版本。

现在 问题 如上所述,上述功能 仅被称为 < em> for 交换的 inititor ,而 被调用对于当前的 turnholder (就像它应该的那样)。当前的转向持有者可以将交换所做的更改合并到存档游戏数据中。他没有被告知他应该留下问题和问题,因为他不能在没有得到通知的情况下采取行动。 我可以通过另一个额外的交换(这是我目前正在使用的解决方法)手动通知他,但这是不合时宜的,因为他必须盲目地合并新的交易所,而不确定它是否已经完成。 / p>

前三个步骤似乎正常工作,因为我看到交易所的发起人被通知了。唯一的问题是没有像文档和教程中描述的那样自动调用第四个函数。

我最近的一个解释是交换完成得太快而听众没有意识到它一直活跃(交易所立即收到回复);但这只是一个疯狂的猜测。即使我想...无论我做什么来延迟回复交换(例如在交换中保存引用,使用DispatchQueue进行延迟函数调用等)导致交易结果为零或者通信错误(消息是通过不同的代理错误发送的)。

基本上我想知道转轮是否真的应该通过调用上述函数得到通知,或者它是否已被更改。

我真的很感激这里的帮助,我已经在这里工作了好几个星期而且还没有到任何地方。其他一切都很好。 我使用最新版本的Swift,最近的方法是使用GKLocalPlayer而不是直接实现Listener(就像推荐的那样)。

亲切地问候,Skeltek

0 个答案:

没有答案