簡體   English   中英

如何可靠地確定響應GKTurnBasedMatchmakerViewController成功創建的匹配項

[英]How to reliably determine which match got created in response to GKTurnBasedMatchmakerViewController success

在iOS 10上,我嘗試使用GKTurnBasedMatchmakerViewController創建匹配。 我可以調出視圖,以便用戶可以選擇匹配或邀請。 我無法弄清楚如何可靠地確定響應於此而創建的匹配。 問題是,在iOS 10中,不推薦使用GKTurnBasedMatchmakerViewControllerDelegate的didFindMatch方法。 過去通過匹配調用該方法。 過去很容易!

棄用消息說“使用GKTurnBasedEventListener播放器:receivedTurnEventForMatch:didBecomeActive”。 文檔和堆棧溢出線程充滿了調用該方法的原因。 請參閱此主題以獲取一個好的列表: Gamecenter ios 9 GameCenter GKLocalPlayerListener方法未調用 如果你想象一個用戶已經有幾個游戲,你可以看到這個方法會因為很多不同的原因而被調用,據我所知,它可能隨時發生。 我的問題是:如何確定這些調用中的哪一個是“我剛剛為你創建了一個匹配,就在這里!” 呼叫。

我認為一些例子不起作用:

  • 簡單地假設在調出GKTurnBasedMatchmakerViewController后第一次調用receiveTurnEventForMatch似乎是錯誤的,因為receivedTurnEventForMatch可能會通知用戶它是另一個游戲中的輪到他們。 除非系統保證在視圖啟動時,它們只會使用與視圖對應的匹配來調用此方法。 這似乎是一個非常大的黑客,所以我假設他們不這樣做。
  • 調用receiveTurnEventForMatch與其他玩家處於“匹配”狀態並且didBecomeActive = true似乎是匹配中第一個玩家的解決方案,但不是第二個(因為兩個玩家完成匹配)。
  • 看看MatchID並看看我們之前是否“看過它”,如果沒有,假設它剛剛創建的匹配似乎不可靠,因為用戶可能已卸載應用程序然后重新安裝,我們已經忘記了所有關於哪個我們之前見過的比賽。

我被困住,任何幫助都表示贊賞。

在事件處理程序觸發時仔細檢查您的狀態。 我相信在你接受比賽之前,你仍然應該處於invited狀態。

編輯:實際上,我相信當事件處理程序觸發時會有兩個條件指示新匹配:

  1. 你處於受邀狀態(你加入了)

  2. 其他人都處於邀請或自動匹配狀態(你開始了比賽)

編輯2:檢查我的舊代碼,結果發現我查看了matchData對象。 因為我知道在玩家1結束轉彎之前玩家2沒有收到邀請(等等),並且因為我知道玩家1必須保存匹配數據才能結束轉彎,如果matchData.length大於零,我以為我正在加入正在進行的游戲。 我沒有依賴參與者的身份。 但這並不能解決你的問題。

我做的另一件事是創建我自己的頭結構,我在NSData的開頭插入。 在該標題中,player1將為每個其他玩家設置狀態標志,當這些玩家加入時,這將是顯而易見的。 我完全忽略了匹配對象中的參與者狀態。

關於你的第三個項目,你可以使用cloudKit遠程保存它,而不是在本地保存列表。 除非您專門刪除,否則cloudkit數據將在安裝/卸載期間保持不變。

cloudkit的要點是:

  • 當您在應用中啟用它時,您的應用會獲得一個“容器”,其中包含所有用戶可以共享的公共數據庫以及每個應用用戶獨有的專用數據庫。
  • 您可以使用“字節”字段在專用數據庫中創建記錄
  • 您可以將NSMutableArray直接保存到上述字節字段中
  • 您可以直接從字節字段讀回NSMutableArray

暫無
暫無

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

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