首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GKGameSession- saveData总是在getShareURLWithCompletionHandler之后出现malloc错误时失败

GKGameSession- saveData总是在getShareURLWithCompletionHandler之后出现malloc错误时失败
EN

Stack Overflow用户
提问于 2016-10-28 07:24:45
回答 2查看 165关注 0票数 1

我正在尝试将GKGameSession融入我的游戏中心游戏中。我尝试了以下几种代码的组合:异步运行命令,将它们链接到完成处理程序中,等等。每次我看到相同的结果:我可以使用saveData非常好的,直到调用了getShareURLWithCompletionHandler为止。之后,任何对saveData的尝试都会引发错误。

下面是显示问题的最简单的代码版本:

代码语言:javascript
复制
CKContainer *defaultContainer = [CKContainer defaultContainer];
[GKGameSession createSessionInContainer:defaultContainer.containerIdentifier
                              withTitle:@"temp title"
                    maxConnectedPlayers:4
                      completionHandler:^(GKGameSession * _Nullable session, NSError * _Nullable error)
{
    if (error)
    {
        [self printError:error];
    }

    [session getShareURLWithCompletionHandler:^(NSURL * _Nullable url, NSError * _Nullable error)
    {
        if (error)
        {
            [self printError:error];
        }
    }];


    NSData *newData = [NSData dataWithBytesNoCopy:@"abcdefghijklmnopqrstuvwxyz" length:26];
    [reSession saveData:newData completionHandler:^(NSData * _Nullable conflictingData, NSError * _Nullable error)
    {
            if (error)
            {
                [self printError:error];
            }
    }];


}];

在大多数情况下,saveData调用只是崩溃:

代码语言:javascript
复制
malloc: *** error for object 0x32df14: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

但有时它会抛出一个错误:

代码语言:javascript
复制
GKGameSessionErrorDomain:GKGameSessionErrorUnknown

我试过保存不同类型的数据。我尝试通过链接完成处理程序中的所有调用来依次进行调用。我尝试过在creationSession完成处理程序的内部和外部执行URL和数据保存。

我在这里做错什么了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-01 00:26:03

我也看到了同样的情况,但有一个更有用的错误:

无法完成请求的操作,因为会话已在服务器上更新,从而导致冲突。

save文档说,

应由开发人员决定如何处理保存冲突。

不过,在这里,每次重试保存都会失败,永远失败。所以是的,这就是你所处的状态。

然而,当加入游戏的玩家进入他们设备上的URL时,他们的GKGameSessionEventListener's didAddPlayer:就会被调用,然后如果他们保存.他们会得到同样的冲突错误,但是如果他们重新尝试保存.这是有效的!

创建链接的玩家被锁定在保存或更新游戏状态之外,直到加入玩家已经更新了数据。当另一个播放机保存时,原始播放机将在session:player:didSave:上调用GKGameSessionEventListener

此时,原始玩家可以按预期保存。

票数 1
EN

Stack Overflow用户

发布于 2016-12-06 17:17:55

你应该把一个街区放进另一个街区。因为块可以按任何顺序完成。

我有这样的工作代码:

代码语言:javascript
复制
NSData *newData = [NSData dataWithBytesNoCopy:@"abcdefghijklmnopqrstuvwxyz" length:26];
[reSession saveData:newData completionHandler:^(NSData * _Nullable conflictingData, NSError * _Nullable error)
{
        if (error)
        {
            [self printError:error];
        } else {
[session getShareURLWithCompletionHandler:^(NSURL * _Nullable url, NSError * _Nullable error)
{
    if (error)
    {
        [self printError:error];
    }
}];

}];

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

https://stackoverflow.com/questions/40300104

复制
相关文章

相似问题

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