Dipende da cosa si sta cercando ritornare. Ma quello che potrebbe confondere te è che se emetti un'istruzione return
all'interno del blocco inDatabase
, stai tornando dal blocco, non stai tornando dal metodo che contiene questo blocco inDatabase
.
Pertanto, non si restituiscono valori dal blocco inDatabase
, ma si restituiscono valori dall'esterno del blocco. Quindi, cosa farai comunemente, dichiarerai la tua variabile da restituire al di fuori del il blocco inDatabase
, il tuo blocco inDatabase
lo aggiornerà, e poi, quando il blocco sarà terminato, sarà restituito il risultato (non da all'interno del blocco inDatabase
).
Un esempio comune è se si sta costruendo un NSMutableArray
: Quindi creare l'array mutabile al di fuori del blocco, e quindi aggiungere i valori all'interno del blocco, ma poi restituisce i risultati dopo si esce dal blocco inDatabase
:
NSMutableArray *results = [NSMutableArray array]; // declare this outside the block
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(1)];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(2)];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(3)];
FMResultSet *rs = [db executeQuery:@"select * from foo"];
while ([rs next]) {
...
[results addObject:result]; // add values inside the block
}
[rs close];
}];
return results; // return the results outside the block
oppure, se hai a che fare con un certo tipo fondamentale, come un NSInteger
o BOOL
o quello che hai, che ci si dichiara la variabile con un qualificatore __block
. Ad esempio, io uso questo per restituire un successo variabile BOOL, ad es .:
__block BOOL success; // again, define outside the block
NSMutableArray *results = [NSMutableArray array];
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(1)];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(2)];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @(3)];
FMResultSet *rs = [db executeQuery:@"select * from foo"];
if (!rs)
{
NSLog(@"%s: %@", __FUNCTION__, [db lastErrorMessage]);
success = NO; // set the value inside the block
return; // note, this doesn't exit the method; this exits this `inDatabase` block
}
while ([rs next]) {
...
}
[rs close];
success = YES; // another example of setting that `success` variable
}];
// so whether I successfully completed the block, or whether I hit the `return`
// statement inside the block, I'll fall back here, at which point I'll return my
// boolean `success` variable
return success; // don't return the value until after you exit the block
Anche se questo potrebbe sembrare confondere la prima volta che lo si incontra, è utile per capire questo. Quando inizi a utilizzare molto il blocco GCD, questo schema è molto comune. Quando si dispone di un blocco (indicato dal carattere ^
), è quasi necessario pensarlo come una funzione che si sta definendo all'interno del metodo principale. Quando si incontra uno return
all'interno di un blocco, si ritorna al metodo che contiene il blocco.
Per introduzioni ai blocchi vedere:
cosa vuoi tornato? Un singolo valore, o un insieme (o una matrice) di risultati dal db (che è quello che sembra si stia provando a fare tramite "' select * '" lassù) ??? –