0

そのため、コード ブロックを準備し、シリアル ディスパッチ キューで同期的に実行するようにスケジュールする関数があります。このシリアル キューが新しいスレッドで実行されることは承知しています。ただし、問題は、コード ブロックが変数を変更し、その変数が関数に返されることです。関数は、その変数を戻り値として返すことが期待されています。以下のコードは、状況を明確にするのに役立ちます。

-(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 まで、関数が返されないようにする方法についてのアイデアはありますか?

4

2 に答える 2

4

シリアルキューで実行されているブロックによって変更された retval まで、関数が返されないようにする方法についてのアイデアはありますか?

結果を待つ必要がある場合、コードは依然として同期的であり、シリアル キューではなくメソッドで実行することもできます。これが最初のオプションです。ここではブロックを使用しないでください。

2 番目のオプションは、実際に非同期で実行されるようにコードを再構築することです。戻り値に依存するコードを見つけて、それをretval別のメソッドまたはブロックに分割します。次に、終了時にその呼び出しを設定するブロックをretval渡しretvalます。

于 2013-01-03T15:53:43.843 に答える
-2

ブロックの後に追加できます

while(YES) {
    if(variable) {
        break;
    }
}

そして、dispatch_asyncretval を定義した後、に追加します

variable = YES;

__block BOOL variable = NO;ブロックの前に定義するだけです。

于 2013-01-03T15:48:46.133 に答える