Проблема в вашем коде в том, что независимо от того, используете ли вы dispatch_sync
или dispatch_async
, всегда будет вызываться STFail()
, что приведет к сбою теста.
Что еще более важно, как объяснил Б. Дж. Гомер, если вам нужно выполнить что-то синхронно в основной очереди, вы должны убедиться, что вы не в основной очереди, иначе произойдет взаимоблокировка. Если вы находитесь в основной очереди, вы можете просто запустить блок как обычную функцию.
Надеюсь, это поможет:
- (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!");
}