iphone - 异步进程给我带来了麻烦

标签 iphone objective-c ios multithreading grand-central-dispatch

我想从游戏中心服务器返回回合制游戏的信息,这很好,但我想要使用异步方法获取的玩家别名:

[GKPlayer loadPlayersForIdentifiers:singleOpponentArray withCompletionHandler:^(NSArray *players, NSError *error) {

                GKPlayer *returnedPlayer = [players objectAtIndex:0];

                NSString *aliasToAdd = [NSString stringWithString:returnedPlayer.alias];
                NSString *idToAdd = [NSString stringWithString:returnedPlayer.playerID];
                NSDictionary *dictionaryToAddToAliasArray = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:aliasToAdd, idToAdd, nil] forKeys:[NSArray arrayWithObjects:@"alias", @"id", nil]];

                [self.aliasArray addObject:dictionaryToAddToAliasArray];


            }];

但是 UI 使用此信息但它没有及时到达。如何使该方法在主线程上同步执行?

谢谢。

最佳答案

任何与 UI 相关的代码都必须在主线程上执行。

如果您的应用必须等待异步调用返回,请首先禁用 UI。例如,在您的 UIView 上设置 userInteractionEnabled = NO

然后,当异步方法返回时,重新启用 UIView

同时,显示某种事件指示器,例如UIActivityIndi​​catorView

当然,只有在无法在后台执行任务的情况下才执行上述操作。切勿不必要地阻塞 UI。我相信您当然已经知道这一点,但对于可能正在阅读本文的任何刚接触该平台的人来说,值得重申一下。

要在主线程上调用,请使用 NSObject 的 performSelectorOnMainThread 方法的变体之一。或者,通过调用 dispatch_get_main_queue 函数,使用主队列将其在 gcd 上排队。

关于iphone - 异步进程给我带来了麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10194135/

相关文章:

ios - 如果一个 ViewController 中有两个 UITableView,一个带有自定义单元格引用,另一个是简单的

ios - NSTimer 无效不起作用

iphone - 将ViewController推到左边-简单吗?

iphone - 如何在 Storyboard中启动 window.xib 文件?

ios - 什么时候应该使用导航 Controller ?

ios - 我在 xCode5-iOS7 中收到错误 "None of the input catalogs contained a matching launch image"

ios - UIButton 框架不随图像调整大小

iphone - 我的 Cydia 存储库出现问题

iphone - 如何在 iPhone 应用程序中显示阿拉伯数字而不本地化每个数字

objective-c - 跳跃动画 : First animation duration doesn't work. IOS