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之前,您先转到
返回分数;