我试图将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提取和数据保存。
我在这里做错了吗?
答案 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];
}
}];
} }];