Разработка iPhone: почему GKLeaderboard loadScoresWithCompletionHandler: возвращает нулевое значение - PullRequest
1 голос
/ 07 сентября 2011

Я сейчас работаю с 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-й метод, но при наличии большого количества баллов у него будет время для обработки.

У кого-нибудь есть такая же проблема?

Спасибо.

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

Попробуйте сузить тип оценки до тех, которые вы действительно хотите обработать.Например, запросите счет для вошедшего в систему игрока, глобального времени и т. Д.

Я использую что-то вроде следующего фрагмента кода в моей собственной игре и это быстро:

// 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];

Вы также можете применить более оптимизированный цикл оценки, как в вашем коде.Надеюсь, это поможет.

1 голос
/ 14 сентября 2011

Боюсь, что с данной информацией у меня нет ответа на вопрос, почему initWithPlayerIDs: не работает.Тем не менее, я мог бы упростить вашу фильтрацию для локального игрока во втором методе.GKLeaderboard имеет свойство localPlayerScore, которое действует только после завершения loadScoresWithCompletionHandler:.localPlayerScore затем дает GKScore для местного игрока.Ваш второй метод будет выглядеть так:

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

Надеюсь, это немного поможет.

...