1

我正在尝试将其整合GKGameSession到我的 Game Center 游戏中。我尝试了以下代码的几种组合:异步运行命令,将它们链接到完成处理程序中,等等。每次我看到相同的结果时:我可以saveData正常使用,直到我调用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 获取和数据保存。

我在这里做错了吗?

4

2 回答 2

1

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

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

save文件说,

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

但是,在这里,每次重试保存都会失败,永远。所以,是的,这与你所处的状态相同。

然而,当加入游戏的玩家在他们的设备上输入 URL 时,他们的GKGameSessionEventListener'sdidAddPlayer:被调用,然后如果他们保存......他们会得到同样的冲突错误,但如果他们然后重试保存......它可以工作!

创建链接的玩家将无法保存或更新游戏状态,直到加入的玩家更新了数据。当另一个玩家保存时,原来的玩家会session:player:didSave:GKGameSessionEventListener.

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

于 2017-02-01T00:26:03.370 回答
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];
    }
}];

} }];

于 2016-12-06T17:17:55.143 回答