Es hängt davon ab, was Sie versuchen, zurückgeben. Was Sie jedoch verwirren könnte, ist Folgendes: Wenn Sie innerhalb des Blocks inDatabase
eine return
-Anweisung ausgeben, kehren Sie aus dem Block zurück, und Sie kehren nicht von der Methode zurück, die diesen Block inDatabase
enthält.
Sie geben also einfach keine Werte aus dem inDatabase
Block zurück, sondern geben Werte von außerhalb des Blocks zurück. Was Sie normalerweise tun, ist, dass Sie Ihre Variable als außerhalb Block inDatabase
deklarieren, Ihr inDatabase
Block wird es aktualisieren, und dann, wenn der Block fertig ist, das ist, wenn Sie die Ergebnisse (nicht aus innerhalb des inDatabase
Blocks).
Ein gängiges Beispiel ist, wenn Sie ein NSMutableArray
Gebäude sind: So außerhalb des Blocks der änderbaren Array erstellen, und dann Werte hinzufügen, aus dem Block, aber dann wieder die Ergebnisse nach verlassen Sie den inDatabase
Block:
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
oder, wenn Sie mit einigen grundlegenden Art zu tun haben, ein wie NSInteger
oder BOOL
oder, was Sie haben, dann würden Sie die Variable mit einem __block
Qualifier erklären. Zum Beispiel werde ich diese verwenden, um einen BOOL Erfolg Variable zurückzukehren, z.B .:
__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
Während dies erscheinen mag das erste Mal verwirrend Sie es begegnen, ist es sinnvoll, dies zu verstehen. Wenn Sie GCD viel blockieren, ist dieses Muster sehr verbreitet. Wenn Sie einen Block haben (durch das Zeichen ^
angezeigt), müssen Sie fast als eine Funktion, die Sie in Ihre Hauptmethode definieren. Wenn Sie in einem Block auf eine return
stoßen, kehren Sie zu der Methode zurück, die den Block enthält.
Für Einführungen in Blöcke zu sehen:
was wollen Sie zurück? Ein einzelner Wert, oder ein Satz (oder Array) von Ergebnissen aus der db (was ist, wie es aussieht, versuchen Sie über "' wählen * '" da oben) ??? –