[英]Is there any way to call saveCurrentTurnWithMatchData without sending a push notification?
[英]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.