首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除处于无效状态的GKTurnBasedMatch

删除处于无效状态的GKTurnBasedMatch
EN

Stack Overflow用户
提问于 2013-03-12 22:59:00
回答 5查看 2.3K关注 0票数 17

我正在做一些实验,试图了解GameKit,我制作了一个简单的游戏和一个界面,其中列出了我的球员的比赛。我试图添加在比赛中使用removeWithCompletionHandler:方法删除游戏的能力,但我在删除似乎已进入无效状态的GKTurnBasedMatch时遇到了问题。

有关的火柴印:

代码语言:javascript
复制
$0 = 0x1d590d20 <GKTurnBasedMatch 0x1d590d20 id:858d8257-cc49-4060-b1d8-38c09a929e3c status:Ended message: taken:2013-03-08 18:08:47 +0000 created:2013-03-08 03:24:14 +0000
current:<GKTurnBasedParticipant 0x1d58c020 - id:G:1717956303 (local player) status:Invited outcome:None lastTurn:(null)>
participants:
    <GKTurnBasedParticipant 0x1d58bc90 - id:G:1717239488 status:Done outcome:Quit lastTurn:2013-03-08 18:08:47 +0000>
    <GKTurnBasedParticipant 0x1d58c020 - id:G:1717956303 (local player) status:Invited outcome:None lastTurn:(null)>
>

这似乎表明比赛已经结束了。然而,其中一位参与者的结果是:没有,我是由医生领导的,他们认为对于一个结束的游戏是无效的。试图简单地删除游戏会给出:

由于一个或多个参数无效,请求的操作无法完成。

在试图设定结果和结束游戏时,会给出:

由于会话处于无效状态,无法完成请求的操作。

我想我可能无法删除这个游戏,因为本地玩家是主动参与者,但是participantQuitInTurnWithOutcome:...endTurnWithNextParticipants:...都给出了错误:

由于会话处于无效状态,无法完成请求的操作。

也是。是我做错了什么,还是我创造了一个不可移动的游戏?

我也无法通过游戏中心提供的界面移除游戏,他们被列在“游戏结束”部分。

EN

回答 5

Stack Overflow用户

发布于 2013-04-22 13:06:20

这就是我如何设法删除所有无效的匹配。

我检查了当前参与者的状态,如果被邀请,我调用declineInviteWithCompletionHandler,否则调用participantQuitInTurnWithOutcome。

在这两个完成块中,我调用removeWithCompletionHandler来删除匹配。

这产生了一些错误,但匹配仍然被删除,所以我的列表是干净的。

这是一个如何避免进入这种状态的解决方法。这有一个额外的好处,如果邀请者在完成第一轮之前退出,那么受邀者甚至都得不到通知。

在playerQuitForMatch中,首先结束转弯,然后在完成处理程序中,立即退出匹配。就像这样,

代码语言:javascript
复制
[match endTurnWithNextParticipants:[NSArray arrayWithObject:nextParticipant]
                                          turnTimeout:GKTurnTimeoutDefault
                                            matchData:nil completionHandler:^(NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                }

                                                [match participantQuitOutOfTurnWithOutcome:GKTurnBasedMatchOutcomeQuit
                                                                     withCompletionHandler:^(NSError *error) {
                                                                         if (error) {
                                                                             NSLog(@"%@" ,error);
                                                                         }
                                                                     }];
                                            }];
票数 7
EN

Stack Overflow用户

发布于 2013-03-16 05:08:18

不幸的是,我也遇到了同样的错误。为了帮助其他人理解这个问题,希望研究一个解决方案,你可以邀请一个朋友参加比赛,然后在第一轮比赛中退出比赛,然后再提交给被邀请的玩家。然后,主机玩家从游戏中心移除比赛。在被邀请玩家的设备上,他们将有一个匹配,看起来像上面引用的,不能被删除。我尝试过各种各样的解决方案。

我还没有任何运气,但我会更新我的答案,如果我找到一个解决方案。我目前正试图推出一个游戏中心的游戏,所以我必须找到一些方法绕过这一点。我会在接下来的一两天内得出结论。

更新:我检查了我的非删除的比赛,他们几乎和你的一样,除了我的球员的邀请状态也有获胜的比赛结果。使比赛进入无效状态的关键似乎是邀请一个球员状态而不是完成,但是要结束比赛状态。这是我们两种情况之间的共同元素,在苹果的比占庭游戏中心代码中,这是一个边缘的例子。如果他们只是简单地搞砸了这个边缘的情况,并期望你“只知道”你不应该让玩家处于那种状态(毫无疑问,如果你仔细阅读了他们的文档,最终你就能把它们拼凑在一起),我也不会感到惊讶。

我的结论是,苹果在他们的手上有一个很容易被忽视的边缘情况,因为只有当你退出一场新的比赛,只有当你邀请了一个朋友时,才会发生这种情况,而且只有当你邀请一个朋友时,你可能不会经常测试两种情况。而且,如果你没有不恰当地设置比赛结果,我猜这是永远不会发生的,所以他们从来没有抓住它。

由于我还没有发布,我将配置我的应用程序来检测这种状态下的匹配,并忽略它们。我将向控制台报告有多少匹配处于这种状态,这样我就可以确保它不会超过这一点。然后,我将分析我的退出代码,并确保在这种边缘情况下,我再也不能将匹配放到这种状态。我认为,考虑到我们所知道的,我们必须积极主动,吸取一些比赛失败的事实。

希望您还没有发布,因此错误案例匹配将本地化到游戏中心的Sandbox环境中。实际上,糟糕的匹配只是局限于沙箱中的测试用户,所以一旦您纠正了问题,您就可以丢弃该用户,并从新用户开始。如果您执行我的上述建议,您应该能够确认您的应用程序是正常工作,然后采取这一步骤。

如果有人能够找到一种方法删除这些错误匹配一旦存在,请告诉我们,但我希望我的建议和确定的实际原因将足以帮助您继续您的项目。

票数 5
EN

Stack Overflow用户

发布于 2013-04-26 16:11:10

我找到了解决办法。对于无效匹配,只需使用-participantQuitOutOfTurn方法,然后使用-removeWithCompletionHandler方法。它将被完全移除。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15373903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档