dispatch_sync
またはdispatch_async
を使用するかどうかにかかわらず、常にSTFail()
が呼び出され、テストが失敗することがあります。
さらに重要なのは、BJホメロスのは、説明したように、あなたがメインキューに同期何かを実行する必要がある場合、あなたはあなたがメインキューまたはどうなるデッドロックになっていないことを確認しなければなりません。メインキューにいる場合は、ブロックを通常の関数として実行するだけです。
希望はこのことができます:あなたがメインキュー上で、同期し利用できるようにメインキューを待つ場合
- (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!");
}
良い質問と私は正解を楽しみにしています。私は、メインキューのdispatch_syncを使用するとデッドロックになり、一般的にはそれを避けることが何度も見つかった。 –
@ D.C。数回またはいつも?私はあなたが 'dispatch_sync(dispatch_get_main_queue()' **をメインスレッド上で**デッドロックを作成しないようにする方法が好奇妙です!) – Honey