我想从游戏中心服务器返回回合制游戏的信息,这很好,但我想要使用异步方法获取的玩家别名:
[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
。
同时,显示某种事件指示器,例如UIActivityIndicatorView
。
当然,只有在无法在后台执行任务的情况下才执行上述操作。切勿不必要地阻塞 UI。我相信您当然已经知道这一点,但对于可能正在阅读本文的任何刚接触该平台的人来说,值得重申一下。
要在主线程上调用,请使用 NSObject 的 performSelectorOnMainThread
方法的变体之一。或者,通过调用 dispatch_get_main_queue
函数,使用主队列将其在 gcd 上排队。
关于iphone - 异步进程给我带来了麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10194135/