2013-12-16 2 views
0

У меня возникла проблема, в настоящее время я использую GKLeaderboards и использую ее для заполнения модели. У меня нет проблем с получением данных, моя проблема возникает, когда я иду, чтобы заполнить таблицуView данными, и она не заполняет массив до его вызова, чтобы заполнить TableView. Из того, что я прочитал, мне нужно использовать Grand Central Dispatch, чтобы он не загружался в основной поток. Любая помощь будет высоко оценена.Использование Grand Central Dispatch с GKLeaderboard

+(EILeaderBoardModel *)scoresAndNameFromLeaderBoard 
{ 
static EILeaderBoardModel *leaderBoard = nil; 
static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    leaderBoard = [[EILeaderBoardModel alloc] init]; 
    leaderBoard.highScorePlayerArray = [[self class] GameCenterLeaderBoard]; 
}); 
return leaderBoard; 
} 
+ (NSMutableArray *)GameCenterLeaderBoard 
{ 
NSMutableArray *_highScorePlayer = [NSMutableArray new]; 

GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init]; 

leaderboardRequest.playerScope = GKLeaderboardPlayerScopeGlobal; 
leaderboardRequest.timeScope = GKLeaderboardTimeScopeAllTime; 
leaderboardRequest.range = NSMakeRange(1, 20); 
leaderboardRequest.identifier = GameHighscoreIdentifier; 

[leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) { 

    if (error != nil) 
    { 
     // Handle the error. 
    } 
    if (scores != nil) 
    { 

     for (NSUInteger i = 0; i < scores.count; i++) { 
      GKScore *score = (GKScore *)scores[i]; 

      [GKPlayer loadPlayersForIdentifiers:@[score.playerID] withCompletionHandler:^(NSArray *players, NSError *error) { 

       GKPlayer *player = (GKPlayer *)players[0]; 

       [player loadPhotoForSize:GKPhotoSizeSmall withCompletionHandler:^(UIImage *photo, NSError *error) { 

        if (error != nil) { 

        } 

        UIImage *_avatar; 
        if (photo != nil) { 
         _avatar = photo; 
        } else { 
         _avatar = [UIImage imageNamed:@"unknownPersonImage.png"]; 
        } 

        EIPlayer *currentPlayer = [EIPlayer nameLabel:player.displayName 
                 scoreLabel:[NSString stringWithFormat:@"%llD",score.value] 
                  avatar:_avatar]; 

        [_highScorePlayer addObject:currentPlayer]; 

       }]; 
      }]; 
     } 
    } 
}]; 
return _highScorePlayer; 
} 

ответ

0
dispatch_queue_t queue = dispatch_queue_create("com.yourQueue.company", 0); 
dispatch_queue_t main = dispatch_get_main_queue(); 

dispatch_async(queue, ^{ 

// Do all your data fetching work here 
// also like adding values to arrays. 

    dispatch_async(main, ^{ 

     // Do all your UI update logic here like updating data into tables. 

     [self.tableView reloadData]; 

    }); 
}); 

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

+0

У меня это работает, спасибо! –

Смежные вопросы