簡體   English   中英

GKTurnBasedMatch saveCurrentTurnWithMatchData 在所有其他調用中返回錯誤

[英]GKTurnBasedMatch saveCurrentTurnWithMatchData returning an error on every other call

玩家在完成一個回合之前采取多項行動。 每次操作后,我都會調用 saveCurrentTurnWIthMatchData,更新匹配數據。

[gameMatch saveCurrentTurnWithMatchData: matchData completionHandler: ^(NSError *error){
             if (error) {
                 NSLog(@"Error updating match = %@",error);
             }
     }];

在所有其他呼叫中,我得到“錯誤域 = GKServerErrorDomain 代碼 = 5002”狀態 = 5002,意外游戲 state 版本預期GameStateVersion ='null'”

每次調用中的 GKTurnBasedMatch.state = 3 (GKTurnBasedMatchStatusMatching)。 我沒有改變這一點,我只是在通話前檢查。 我不知道這是否相關。

有什么建議可以嘗試嗎?

“意外的游戲 state 版本”錯誤不規律地發生並且難以重現 - 盡管我經常可以通過快速連續多次調用saveCurrentTurn來重現它。 由於它似乎是服務器端(但我不確定),因此 Apple 對此進行澄清會很有用。 我編寫了一個單元測試,對GKTurnBasedMatch.saveCurrentTurn進行壓力測試。 它不規則地失敗,但通常高達 20% 的時間。

我沒有完整的解決方案,只有部分解決方案。 為了部分緩解該問題,您可以將saveCurrentTurn調用包裝在任務隊列中,這樣它們就會等待前一個調用完成。 不是解決方案,但有幫助。

let dqt:DispatchQueueTask = {
    gkTurnBasedMatch.saveCurrentTurn(withMatch:payload) { error in
        //handle error
        TaskQueue.completion() //step to next task
    }
}
TaskQueue.add(task:dqt)

這是我使用的任務隊列 class

import Foundation

/*
 Uses the DispatchQueue to execute network commands in series
 useful for server commands like GKTurnBasedMatch.saveCurrentTurn(...)

 Usage:
     let doSomethingThatTakesTime:DispatchQueueTask = {
         ...
         TaskQueue.completion()
     }
 
     TaskQueue.add(task: doSomethingThatTakesTime)
 */

typealias DispatchQueueTask = () -> ()
let DispatchQueue_serial = DispatchQueue(label: "org.my.queue.serial")

class TaskQueue {
    static var isRunning:Bool = false
    static var tasks:[DispatchQueueTask] = []
    
    static func add(task:@escaping DispatchQueueTask) {
        tasks.append(task)
        run()
    }
        
    static func run() {
        guard !isRunning else { return }
        guard tasks.count > 0 else { return }
        let task = tasks.removeFirst()
        DispatchQueue_serial.async {
            TaskQueue.isRunning = true
            task()
        }
    }

    static func completion() {
        TaskQueue.isRunning = false
        TaskQueue.run()
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM