2013-06-13 4 views
5

Sto lavorando su un turno a base iOS gioco e cercando di compilare la mia lista dei giochi il giocatore sta partecipando.È possibile taggare i blocchi?

for (unsigned i = 0; i < [matches count]; i++) 
{ 
    // Only load data for games in progress. 
    // NOTE: Might want to handle finished games later. 
    if ([matches[i] status] != GKTurnBasedMatchStatusEnded) 
    { 

     // Send off another block to retrieve the match's data. 
     [(GKTurnBasedMatch*)matches[i] loadMatchDataWithCompletionHandler: ^(NSData *matchData, NSError *error) 
     { 
      // Prepare the game. 
      Game* game; 
      if (matchData.length == 0) 
      { 
       // If the match data is empty, this is a new game. Init from scratch. 
       game = [[Game alloc] init]; 
      } 
      else 
      { 
       // Otherwise, unpack the data and init from it. 
       game = [NSKeyedUnarchiver unarchiveObjectWithData:matchData]; 
      } 
      game.match = matches[i]; 

      // Load the displayNames for the players. 
      bool lastIndex = i == ([matches count] - 1); 
      [self loadPlayerIdentifiersForGame:game intoArray:blockGames lastIndex:lastIndex]; 
     }]; 
    } 
} 

Purtroppo, sto avendo un problema in cui non riesco a etichettare ogni blocco con il suo indice . Cioè, i è sempre 0 al momento dell'esecuzione del blocco. C'è un modo per assicurarmi che il blocco sappia cosa era i nel momento in cui è stato avviato?

+2

Ogni blocco deve acquisire esattamente il valore di "i" al momento della creazione del blocco. Non riesco a vedere perché 'i' dovrebbe essere sempre zero quando viene eseguito il blocco. –

+0

hai provato invece di i, cattura il __block int j = i; e poi invece di usare il j? – taffarel

risposta

0

ho aggirato il problema per cui il mio UITableView non avrebbero ricaricare se l'ultima partita era finita in questo modo invece:

GKTurnBasedMatch* match; 
for (int j = ([matches count] - 1); j >= 0; j --) 
{ 
    match = matches[j]; 
    if (match.status != GKTurnBasedMatchStatusEnded) 
     break; 
} 
bool lastIndex = (matches[i] == match); 
[self loadPlayerIdentifiersForGame:game intoArray:blockGames lastIndex:lastIndex]; 
0
-(void)someMethod { 
    ... 
    for (unsigned i = 0; i < [matches count]; i++) 
    { 
     // Only load data for games in progress. 
     // NOTE: Might want to handle finished games later. 
     if ([matches[i] status] != GKTurnBasedMatchStatusEnded) 
      [self loadMatch:i of:matches]; 
    } 
} 

-(void) loadMatch:(int)i of:(NSArray *)matches { 
    // Send off another block to retrieve the match's data. 
    [(GKTurnBasedMatch*)matches[i] loadMatchDataWithCompletionHandler: ^(NSData *matchData, NSError *error) 
    { 
     // Prepare the game. 
     Game* game; 
     if (matchData.length == 0) 
     { 
      // If the match data is empty, this is a new game. Init from scratch. 
      game = [[Game alloc] init]; 
     } 
     else 
     { 
      // Otherwise, unpack the data and init from it. 
      game = [NSKeyedUnarchiver unarchiveObjectWithData:matchData]; 
     } 
     game.match = matches[i]; 

     // Load the displayNames for the players. 
     bool lastIndex = i == ([matches count] - 1); 
     [self loadPlayerIdentifiersForGame:game intoArray:blockGames lastIndex:lastIndex]; 
    }]; 
} 
0

il modo più semplice è quello di passare un terzo parametro contenente il tag ..

e suggerisco di usare typedef .. per meglio scrivere il codice (e lasciare il lavoro il completamento automatico per voi ..)

typedef void (^ CompletionBlock) (tag NSInteger , NSData * data, NSError * err);

e utilizzare CompletionBlock quando si definisce loadMatchDataWithCompletionHandler.