コードの問題は、dispatch_sync
またはを使用するかどうかに関係なくdispatch_async
、STFail()
常に呼び出され、テストが失敗することです。
さらに重要なことは、BJ Homer が説明したように、メイン キューで何かを同期的に実行する必要がある場合は、メイン キューにいないことを確認する必要があります。そうしないと、デッドロックが発生します。メイン キューにいる場合は、通常の関数としてブロックを実行するだけです。
お役に立てれば:
- (void)testSample {
__block BOOL didRunBlock = NO;
void (^yourBlock)(void) = ^(void) {
NSLog(@"on main queue!");
// Probably you want to do more checks here...
didRunBlock = YES;
};
// 2012/12/05 Note: dispatch_get_current_queue() function has been
// deprecated starting in iOS6 and OSX10.8. Docs clearly state they
// should be used only for debugging/testing. Luckily this is our case :)
dispatch_queue_t currentQueue = dispatch_get_current_queue();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
if (currentQueue == mainQueue) {
blockInTheMainThread();
} else {
dispatch_sync(mainQueue, yourBlock);
}
STAssertEquals(YES, didRunBlock, @"FAIL!");
}