在getShareURLWithCompletionHandler之后,GKGameSession- saveData始终失败并出现malloc错误

时间:2016-10-28 07:24:46

标签: ios game-center gkgamesession

我试图将GKGameSession合并到我的游戏中心游戏中。我已经尝试了以下代码的几种组合:异步运行命令,在完成处理程序中链接它们等等。每次我看到相同的结果:我可以使用saveData就好了直到< / strong>我打电话给getShareURLWithCompletionHandler。之后,任何saveData的尝试都会抛出错误。

这是展示问题的最简单的代码版本:

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来电只会崩溃:

malloc: *** error for object 0x32df14: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

但有时会抛出错误:

GKGameSessionErrorDomain:GKGameSessionErrorUnknown

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

我在这里做错了吗?

2 个答案:

答案 0 :(得分:1)

我看到的相同,但有一个更有用的错误:

  

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

save文档说明,

  

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

但是,重复保存每次都会失败,永远。所以是的,那就是你所处的状态。

然而,当加入游戏的玩家在他们的设备上输入网址时,会调用他们的GKGameSessionEventListener的{​​{1}},然后如果他们保存...他们会遇到相同的冲突错误,但是如果他们然后重试保存......它可以工作!

创建链接的玩家无法保存或更新游戏状态,直到加入玩家更新了数据。当其他玩家保存时,原始玩家会在didAddPlayer:上接听session:player:didSave:

此时原始播放器可以按预期保存。

答案 1 :(得分:0)

你应该把一个区块放在其他区域内。因为块可以按任何顺序完成。

我有这样的代码:

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];
    }
}];

}     }];