gpt4 book ai didi

ios - 除非另有说明,否则所有 iOS GameCenter 回调都在主线程上执行吗?

转载 作者:可可西里 更新时间:2023-11-01 05:54:29 27 4
gpt4 key购买 nike

我从各种来源阅读了很多关于 GameCenter 的内容...特别是 Apple 的文档以及一些关于实现 GameCenter 多人游戏的 Apress 书籍,但我找不到关于我是否可以信任诸如 matchmakerViewController 之类的回调的明确答案: didFindMatch 或 match:didReceiveData:fromPlayer(仅举几个例子)总是出现在主线程上。

有时在 Apple 的文档中,他们明确表示调用将始终在主线程上进行,但对于每个函数的清晰度并不一致。

Apress 书籍往往对线程完全偏执,因此他们使用 dispatch_async 来确保它最终在主线程上。

我的问题很简单...我是否可以相信,除非 Apple 另有说明,调用将在主线程上进行,还是我需要像 Apress 书中那样偏执。

(请不要回答“只是到处偏执,不要担心”)

最佳答案

我一直在研究同样的事情,我能找到的关于这个问题的 Apple 最明确的评论是在他们提供的 GKTapper 示例应用程序中 GameCenterManager.m 文件头部的评论中(https://developer.apple.com/library/ios/samplecode/gktapper/Listings/Classes_GameCenterManager_m.html):

“GameCenter does not guarantee that callback blocks will be execute on the main thread. As such, your application needs to be very careful in how it handles references to view controllers. If a view controller is referenced in a block that executes on a secondary queue, that view controller may be released (and dealloc'd) outside the main queue.”

建议的解决方案(并在示例中实现)如下所示。
尽管自代码发布以来 GameKit 已经发布了几个新版本,但我没有看到任何表明这不再是问题的信息,因此我将在我自己的代码中实现这个解决方案。

- (void) callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err
{
assert([NSThread isMainThread]);
if([delegate respondsToSelector: selector])
{
if(arg != NULL)
{
[delegate performSelector: selector withObject: arg withObject: err];
}
else
{
[delegate performSelector: selector withObject: err];
}
}
else
{
NSLog(@"Missed Method");
}
}



- (void) callDelegateOnMainThread: (SEL) selector withArg: (id) arg error: (NSError*) err
{
dispatch_async(dispatch_get_main_queue(), ^(void)
{
[self callDelegate: selector withArg: arg error: err];
});
}

我强烈建议您下载 GKTapper 示例应用并试用它,看看它是如何工作的,然后再深入研究并实现您自己的 GameKit 解决方案。

关于ios - 除非另有说明,否则所有 iOS GameCenter 回调都在主线程上执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22019063/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com