iOS:从Google Play游戏服务中检索分数
我有这样的代码来检索当前玩家的分数:iOS:从Google Play游戏服务中检索分数,ios,objective-c,Ios,Objective C,我有这样的代码来检索当前玩家的分数: int iOSHelper::retrieveScore(){ if(!gameServicesIsSignedIn()) return 0; __block int score=0; [GPGPlayer localPlayerWithCompletionHandler:^(GPGPlayer *player, NSError *error) { if (!error){ GPGLeaderboard *myLeaderbo
int iOSHelper::retrieveScore(){
if(!gameServicesIsSignedIn())
return 0;
__block int score=0;
[GPGPlayer localPlayerWithCompletionHandler:^(GPGPlayer *player, NSError *error) {
if (!error){
GPGLeaderboard *myLeaderboard = [GPGLeaderboard leaderboardWithId:@LEADERBOARD_ID];
myLeaderboard.social = YES;
myLeaderboard.timeScope = GPGLeaderboardTimeScopeAllTime;
[myLeaderboard loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
if (!error){
for (GPGScore *nextScore in scores) {
if ([player.playerId isEqualToString:nextScore.player.playerId]){
score = static_cast<int>(nextScore.value);
NSLog(@"has a score of %d", score);
break;
}
}
}
}];
}
}];
return score;
}
int-iosholper::retrieveScore(){
如果(!GameServicesSignedIn())
返回0;
__区块积分=0;
[GPGPlayer localPlayerWithCompletionHandler:^(GPGPlayer*播放器,N错误*错误){
如果(!错误){
GPGLeaderboard*MyLeadboard=[GPGLeaderboard排行榜ID:@leadboard_ID];
myleadboard.social=是;
MyLeadBoard.timeScope=GPGLeaderboardTimeScopeAllTime;
[MyLeadboard loadScoresWithCompletionHandler:^(NSArray*分数,NSError*错误){
如果(!错误){
for(GPGScore*nextScore分数){
if([player.playerId isEqualToString:nextScore.player.playerId]){
分数=静态施法(nextScore.value);
NSLog(@“得分为%d”,得分);
打破
}
}
}
}];
}
}];
返回分数;
}
问题是:如果我将NSLog放入循环中,那么分数就被正确地检索到了。当我将NSlog放在循环之外时,就在“returnscore;”之前,它显示分数为0。
请给我你的建议来解决这个问题。我真的很感谢你的帮助。
非常感谢,不用管伙计们,
整个下午我都在四处寻找,找到了一个解决办法(也许不是最好的,但现在对我来说很有效)。如果您有一些建议可以使代码更加优化,我仍然感谢您的帮助。以下是经过修改的代码:
int iOSHelper::retrieveScore(){
if(!gameServicesIsSignedIn())
return 0;
__block int score=0;
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
[GPGPlayer localPlayerWithCompletionHandler:^(GPGPlayer *player, NSError *error) {
//if (!error){
GPGLeaderboard *myLeaderboard = [GPGLeaderboard leaderboardWithId:@LEADERBOARD_ID];
myLeaderboard.social = YES;
myLeaderboard.timeScope = GPGLeaderboardTimeScopeAllTime;
[myLeaderboard loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
if (!error){
for (GPGScore *nextScore in scores) {
if ([player.playerId isEqualToString:nextScore.player.playerId]){
score = static_cast<int>(nextScore.value);
NSLog(@"has a score of %d", score);
break;
}
}
}
dispatch_semaphore_signal(sem);
}];
}];
while (dispatch_semaphore_wait(sem, DISPATCH_TIME_NOW)) { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]]; }
dispatch_release(sem);
NSLog(@"has a score of %d", score);
return score;
}
int-iosholper::retrieveScore(){
如果(!GameServicesSignedIn())
返回0;
__区块积分=0;
dispatch\u sem=dispatch\u semaphore\u create(0);
[GPGPlayer localPlayerWithCompletionHandler:^(GPGPlayer*播放器,N错误*错误){
//如果(!错误){
GPGLeaderboard*MyLeadboard=[GPGLeaderboard排行榜ID:@leadboard_ID];
myleadboard.social=是;
MyLeadBoard.timeScope=GPGLeaderboardTimeScopeAllTime;
[MyLeadboard loadScoresWithCompletionHandler:^(NSArray*分数,NSError*错误){
如果(!错误){
for(GPGScore*nextScore分数){
if([player.playerId isEqualToString:nextScore.player.playerId]){
分数=静态施法(nextScore.value);
NSLog(@“得分为%d”,得分);
打破
}
}
}
调度信号量信号(sem);
}];
}];
while(dispatch_semaphore_wait(sem,dispatch_TIME_NOW)){[[nsrunlop currentlunloop]运行模式:NSDefaultRunLoopMode beforeDate:[NSDate DateWithTimeIntervalenceNow:10]];}
调度发布(sem);
NSLog(@“得分为%d”,得分);
返回分数;
}
这一次,两个NSLog显示相同且正确的分数。我的猜测?您的方法是异步的。它被称为“问题”。换句话说,在进入completionHandler之前,您先转到
返回分数;
。