所以我已经在这几个星期了,从来没有在网上的任何地方找到答案。源代码注释,各种文档和各种来源声称,当交换的所有收件人回复或超时时,应该调用函数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