1. ホーム
  2. objective-c

[解決済み] 非同期でディスパッチされたブロックが終了するのを待つには?

2022-04-15 18:04:25

質問

Grand Central Dispatchを使用して非同期処理を行うコードをテストしています。テストコードは以下のようなものです。

[object runSomeLongOperationAndDo:^{
    STAssert…
}];

テストは操作の終了を待つ必要があります。私の現在の解決策は次のようなものです。

__block BOOL finished = NO;
[object runSomeLongOperationAndDo:^{
    STAssert…
    finished = YES;
}];
while (!finished);

ちょっと雑に見えますが、もっといい方法をご存知ですか?私はキューを公開し、それから dispatch_sync :

[object runSomeLongOperationAndDo:^{
    STAssert…
}];
dispatch_sync(object.queue, ^{});

...しかし、これはおそらく object .

解決方法は?

を使おうとしています。 dispatch_semaphore . このように表示されるはずです。

dispatch_semaphore_t sema = dispatch_semaphore_create(0);

[object runSomeLongOperationAndDo:^{
    STAssert…

    dispatch_semaphore_signal(sema);
}];

if (![NSThread isMainThread]) {
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
} else {
    while (dispatch_semaphore_wait(sema, DISPATCH_TIME_NOW)) { 
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0]]; 
    }
}

これは runSomeLongOperationAndDo: は、その操作が実際にはスレッド化に値するほど長くはないと判断し、代わりに同期的に実行されるようにします。