私のアプリでは、GameCenter プレイヤー ID をエイリアスに変換しようとしています。ID を受け取ったら、ループから次のメソッドを呼び出します。メソッドは一度に 1 つの ID で呼び出され、単一のエイリアスを返す必要があります。単一のエイリアスを返そうとしていますが、それを機能させることができません。最初はリターンをブロックに入れましたが、ブロック内でリターンできないことがわかりました。これで、オブジェクトを配列に追加してブロックの後に戻るように設定しましたが、次のエラーが表示されます: [__NSArrayM objectAtIndex:]: インデックス 0 が空の配列の境界を超えています。どんな助けでも大歓迎です。
@property (nonatomic, strong, retain) NSMutableArray * playerScores;
.
-(void)getScoresAndAliasForLeaderboard{
[GKLeaderboard loadLeaderboardsWithCompletionHandler:^(NSArray *leaderboards, NSError *nsError) {
if( nsError != nil )
{
//error( nsError, "get leaderboard score" ) ;
return ;
}
for( GKLeaderboard* board in leaderboards )
{
board.timeScope = GKLeaderboardTimeScopeAllTime;
board.playerScope = GKLeaderboardPlayerScopeGlobal;
board.range = NSMakeRange(1, 100);
[board loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
NSLog(@"board: %@",board.description);
NSLog(@"error: %@",error);
if (error == nil)
{
for (GKScore *s in scores)
{
GCLeaderboardScore *playerScore = [[GCLeaderboardScore alloc] init];
playerScore.playerID = s.playerID;
playerScore.score = (int)s.value;
playerScore.rank = s.rank;
NSArray * player = [[NSArray alloc]initWithObjects:s.playerID, nil];
[self loadPlayerData:player];
playerScore.alias = [_playerScores objectAtIndex:0];
NSLog(@"alias: %@, score: %d",playerScore.alias ,playerScore.score);
[_dataMutableArray addObject: playerScore];
}
[self.tableView reloadData];
}
}];
}
}] ;
}
.
-(NSString*) loadPlayerData: (NSArray *) identifiers
{
if(!_playerScores){
_playerScores = [[NSMutableArray alloc]init];
}
[GKPlayer loadPlayersForIdentifiers:identifiers withCompletionHandler:^(NSArray *players, NSError *error)
{
if (error != nil)
{
// Handle the error.
}
if (players != nil)
{
GKPlayer* player = [players objectAtIndex:0];
[_playerScores addObject:player.alias];
}
}];
return [_playerScores objectAtIndex:0];
}