Кажется, ваш вопрос сводится к тому, «как вернуть значение из блока обратно в вызывающую функцию?»На самом деле это довольно просто, если блок выполняется синхронно.Просто используйте переменную __block
и присвойте ей значение.
__block NSString *result = nil;
[queue inDatabase:^(FMDatabase *db) {
// I'm assuming this is synchronous, because I'm not familiar with the API
FMResultSet *rs = [db executeQuery:@"SELECT ref_text FROM table WHERE page = ?", [NSNumber numberWithInteger:page]];
if ([rs next]) {
result = [[rs acquireStringSomehow] retain];
}
}];
return [result autorelease];
Обратите внимание, что сохранение заключается в том, что может быть пул автоматического освобождения, обернутый вокруг блока, и мы должны убедиться, что значение сохраняется (а затемможет автоматически высвобождать его вне блока).
Если вместо этого блок выполняется асинхронно, вы не сможете получить значение, возвращаемое из вызывающей функции.Если вам нужно обработать этот случай, то вам нужно передать значение обратно в соответствующий поток для последующей обработки, например,
NSString *str = [rs fetchStringSomehow];
dispatch_async(dispatch_get_main_queue(), ^{
processString(str);
});