GKTurnBasedMatch - игрок (полученныйExchangeReplies) не запущен для текущего участника - PullRequest
0 голосов
/ 21 мая 2018

так что я занимался этим уже несколько недель и так и не нашел ответа нигде в сети.В комментариях к исходному коду, в различной документации и в различных источниках утверждается, что функция 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)
        }
    }
}

Вот как отправляется Запрос обмена :

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)
    }
})

После этого по завершении обмена, следующая переопределенная функция должна вызываться автоматически .Для обоих для инициатор обмена и для текущий поворотный элемент :

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...
}

Это Swift-версия вышеупомянутой функции ObjectiveC.

Теперь проблема Как сказано, что вышеуказанная функция вызывается только для инициатор обмена, в то время как не вызывается для текущего держателя (как и должно быть).Предполагается, что текущий получатель данных объединит изменения, внесенные биржами, в данные сохраненной игры.Его не уведомляют, как будто он должен оставить проблему и проблему, потому что он не может действовать без уведомления.Я мог бы сделать так, чтобы он был уведомлен вручную другим дополнительным обменом (это обходной путь, которым я сейчас пользуюсь), но это как-то не относится к делу, так как ему пришлось бы слепо объединить новый обмен без какой-либо уверенности в его завершении.

Первые 3 шага работают нормально, так как я вижу, что инициатор обмена уведомляется.Единственная проблема заключается в том, что четвертая функция не вызывается автоматически, как описано в Документациях и руководствах.

Одна из моих последних интерпретаций заключалась в том, что обмен завершается слишком быстро, и слушатель даже не осознает, что он когда-либо был активен (обмен получен ответом)немедленно на получение);но это просто дикое предположение.Даже если бы я хотел ... что бы я ни делал, чтобы отложить ответ на обмен (например, сохранение ссылки на обмен, использование DispatchQueue для отложенного вызова функции или аналогичного), это приведет либо к тому, что обмен не получится, либо к ошибкам связи(сообщение было отправлено из-за другой ошибки прокси-сервера).

В основном мне интересно, действительно ли получатель должен получать уведомления при вызове вышеуказанной функции или если он мог быть изменен.

Я быочень ценю помощь здесь, я был в этом в течение нескольких недель и нигде не получил.Все остальное работает нормально.Я использую последнюю версию Swift с самым последним подходом использования GKLocalPlayer вместо прямой реализации Listener (как это рекомендуется везде).

С уважением, Skeltek

...