iPhone开发:为什么KLeaderboard loadScores WithCompletionHandler:返回一个空值

时间:2011-09-07 10:25:14

标签: objective-c ios game-center

我现在正在与Game Center合作,我遇到了GC问题。 当我使用initWithPlayerIDs:时,在调用loadScoresWithCompletionHandler:callback时,我得不到任何分数。

GKLeaderboard *leaderBoard = [[[GKLeaderboard alloc] initWithPlayerIDs:[NSArray arrayWithObject:gcPlayerID]] autorelease];
leaderBoard.timeScope = GKLeaderboardTimeScopeAllTime;
leaderBoard.category = @"SomeLeaderboard";

[leaderBoard loadScoresWithCompletionHandler:  ^(NSArray *scores, NSError *error) {
 if (error == nil) 
 {
     // scores is null
     // ...
 }

但是当我在做的时候:

GKLeaderboard *leaderBoard = [[[GKLeaderboard alloc] init] autorelease];
leaderBoard.timeScope = GKLeaderboardTimeScopeAllTime;
leaderBoard.category = @"SomeLeaderboard";

[leaderBoard loadScoresWithCompletionHandler:  ^(NSArray *scores, NSError *error) {
 if (error == nil) 
 {
     for (GKScore* score in scores) 
        if ([score.playerID isEqualToString:gcPlayerID])
        {
            // Got something here
            return;
        }
 }

它正在运作。

我现在正在使用第二种方法,但如果有很多分数,它会有时间处理。

有没有人有同样的问题?

感谢。

2 个答案:

答案 0 :(得分:1)

我担心根据给定的信息,我无法回答为什么initWithPlayerIDs:无效。但是,我可以在第二种方法中简化对本地玩家得分的过滤。 GKLeaderboard的属性localPlayerScore仅在loadScoresWithCompletionHandler:完成后才有效。 localPlayerScore然后为本地玩家提供GKScore。你的第二种方法看起来像这样:

[leaderBoard loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
    if (error == nil) 
    {
        GKScore* myScore = leaderboard.localPlayerScore; 
    }
 }

希望这有点帮助。

答案 1 :(得分:1)

尝试将分数类型缩小到您真正想要处理的分数。例如,请求登录播放器的分数和全球时间范围等。

我在自己的游戏中使用类似下面的代码片段并且速度很快:

// Load score for player
     GKLeaderboard *board = [[GKLeaderboard alloc] initWithPlayerIDs:[NSArray arrayWithObject:myGCPlayerID]];

     board.timeScope = GKLeaderboardTimeScopeAllTime;
     board.playerScope = GKLeaderboardPlayerScopeGlobal;
     board.category = @"myGCCategory";

     [board loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
      if(error != nil) {
       NSLog(@"Error loading score:\n%@", [error localizedDescription]);
      }

      if(scores != nil) {
       for(int i=0; i<[scores count]; i++) {
        GKScore *score = (GKScore *)[scores objectAtIndex:i];

        if(([score.playerID isEqualToString:myGCPlayerID]) &&
           (score.value > playerLastScore)) {
         playerLastScore = score.value;
        }
       }
      }
     }];

     [board release];

您也可以在代码中应用更优化的分数循环。我希望这会有所帮助。