そのため、コード ブロックを準備し、シリアル ディスパッチ キューで同期的に実行するようにスケジュールする関数があります。このシリアル キューが新しいスレッドで実行されることは承知しています。ただし、問題は、コード ブロックが変数を変更し、その変数が関数に返されることです。関数は、その変数を戻り値として返すことが期待されています。以下のコードは、状況を明確にするのに役立ちます。
-(DCILocation*) getLocationsByIdentifier: (NSString*) identifier andQualifier: (NSString*) qualifier {
__block DCILocation* retval = nil;
NSString* queryStr = [self baseQueryWithFilterSet:nil];
queryStr = [queryStr stringByAppendingString:@" (identifier = ? OR icao = ?) AND qualifier = ?"];
[self.queue inDatabase:^(FMDatabase *db) {
FMResultSet* results = [db executeQuery:queryStr,
[identifier uppercaseString],
[identifier uppercaseString],
[qualifier uppercaseString]];
if ((nil != results) && [results next]) {
dispatch_async(dispatch_get_main_queue(), ^{
retval = [DCIAirportEnumerator newAirportForStatement:results];
});
[results close];
}
}];
return retval;
}
「self.queue」は、ブロックが実行されるシリアル ディスパッチ キューです。ブロックが「retval」を変更し、メイン スレッドへの dispatch_async 呼び出しをネストして更新することに注意してください。ただし、シリアル ディスパッチ キューで実行されているコード ブロックがそれを変更できるようになる前に、"return retval" (関数の最後の行) が呼び出される可能性があるという懸念があります。これにより、「nil」が返されます。
シリアルキューで実行されているブロックによって変更された retval まで、関数が返されないようにする方法についてのアイデアはありますか?