2015-05-22 53 views
-1

比分我有這樣我的代碼來檢索當前玩家的分數:的iOS:檢索從谷歌Play遊戲服務

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; 
} 

的問題是:如果我把NSLog的內循環,比分被檢索正確。當我把NSlog放在循環之外時,就在「返回分數」之前,它顯示分數爲0. 請給我你的建議來解決這個問題。我非常感謝你的幫助。 非常感謝,

+0

我的猜測是?你的方法是異步的。這是已知的「問題」。換句話說,在去完成處理程序之前,你要去「迴歸分數」。 – Larme

回答

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; 

} 

這次,兩個NSlogs顯示相同和正確的分數。

相關問題