2014-02-05 3 views
6

Leaderboard Game Center에서 로컬 플레이어의 점수를 얻는 방법은 무엇입니까? 이 코드를 시도했지만 아무것도 반환하지 않습니다. 아무도 그것을 해결하는 방법을 알고 있거나 점수를 얻는 더 좋은 방법이 있습니까? 내가 생각Game Center에서 로컬 플레이어 점수를 얻는 방법

- (NSString*) getScore: (NSString*) leaderboardID 
{ 
    __block NSString *score; 
    GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init]; 
    if (leaderboardRequest != nil) 
    { 
     leaderboardRequest.identifier = leaderboardID; 

     [leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) { 
      if (error != nil) 
      { 
       NSLog(@"%@", [error localizedDescription]); 
      } 
      if (scores != nil) 
      { 
       int64_t scoreInt = leaderboardRequest.localPlayerScore.value; 
       score = [NSString stringWithFormat:@"%lld", scoreInt]; 
      } 
     }]; 
    } 
    return score; 
} 

, 그 방법 [leaderboardRequest loadScoresWithCompletionHandler의 완료를 기다릴 필요가 : 그것은 가능 ...

인가?

+0

로컬 플레이어 점수를 전달하는 프로토콜을 사용하십시오. :-) –

답변

5

코드에 내가 볼 수있는 버그가없는 것 같습니다. 표준 리더 보드 인터페이스를 표시하여 점수를보고하는 코드가 실제로 올바르게 작동하는지 확인하는 것이 좋습니다. 그렇다면 리더 보드에서 점수를 확인해야합니다. 아래 코드는 내 게임에서 작동하며 기본 게임 센터 UI에 표시되기 때문에 점수보고가 제대로 작동하고 있음을 알고 있습니다.

GKGameCenterViewController *gameCenterVC = [[GKGameCenterViewController alloc] init]; 
gameCenterVC.viewState = GKGameCenterViewControllerStateLeaderboards; 
gameCenterVC.gameCenterDelegate = self; 
[self presentViewController:gameCenterVC animated:YES completion:^{ 
     // Code 
}]; 
3

당신은 블록 밖에서 점수를 반환 할 수 없습니다 : 당신은 아래 코드는 기본 리더 (iOS7에)를 보여 작동 방법, 확실하지 않은 경우

GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init]; 
leaderboardRequest.identifier = kLeaderboardCoinsEarnedID; 
[leaderboardRequest loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) { 
    if (error) { 
     NSLog(@"%@", error); 
    } else if (scores) { 
    GKScore *localPlayerScore = leaderboardRequest.localPlayerScore; 
    CCLOG(@"Local player's score: %lld", localPlayerScore.value); 
    } 
}]; 

. 이 코드에서는 먼저 "return score"가 "loadScoresWithCompletionHandler"메소드 전에 실행됩니다. 또한 "score"에 대한 초기 값을 설정하지 않았으므로이 메서드는 완전히 임의의 값을 반환합니다. 난 당신이 대신에, 블록 내부에 적절한 코드를 삽입하는 것이 좋습니다 :

int64_t scoreInt = leaderboardRequest.localPlayerScore.value; 
score = [NSString stringWithFormat:@"%lld", scoreInt];
1

리더 보드 요청은 메서드의 반환 후에 완료됩니다. 즉, 널 (NULL) 문자열을 리턴합니다.

리더 보드 요청을 삽입하는 방법은 요청을 보내기위한 것입니다. 메소드는 리더 보드 요청이 완료되기 전에 실행이 완료되므로 "score = [NSString stringWithFormat : @"% lld ", scoreInt];" 그 라인이 실행될 때까지 null 인 "score"가 리턴 된 후에 라인이 실행 중입니다.

해결 방법은 요청을 보내는 메서드를 사용하여 완료 처리기의 결과를 반환하지 않는 것입니다. 점수는 정확하게 정확하게 검색되고 있으므로 완료 처리기 내부에서 필요한 점수를 입력하십시오. 완료 핸들러가 언제 실행되는지 알 수있는 방법이 없습니다. 사실, 이것은 애플이 블록 내에서 실행될 코드를 저장할 수있게 해주는 이유이다. 나중에 확실히 실행될 블록을 사용하여 작업하는 방법이나 메서드가 반환 된 후 상황에 따라 이해하는 것이 혼란 스러울 수 있습니다.

상황을 처리하는 가장 좋은 방법은이 방법에서 아무 것도 반환하지 않고 블록이 점수를 null이 아닌 값으로 설정 한 후에 의도 한대로 "점수"변수를 사용하는 것입니다.

관련 문제