私はキューとそれらがどのように機能するかをよりよく理解しようとしています。このスニペットは、彼らの行動をテストするためのものです:
- (void)dispatchQueueTest
{
NSLog( @"Begin test on %@ thread", [NSThread isMainThread] ? @"main" : @"other" );
dispatch_semaphore_t s = dispatch_semaphore_create(0);
dispatch_async( dispatch_get_main_queue(), ^{
NSLog( @"Signalling semaphore" );
dispatch_semaphore_signal(s);
});
NSLog( @"Waiting for worker" );
while( dispatch_semaphore_wait( s, DISPATCH_TIME_NOW ) ) {
NSDate* timeout = [NSDate dateWithTimeIntervalSinceNow:10.f];
// Process events on the run loop
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:timeout];
}
dispatch_release(s);
NSLog( @"All sync'd up" );
}
予想されるように、ログにこれが生成されます。
Begin test on main thread
Waiting for worker
Signalling semaphore
All sync'd up
奇妙なことに、このコードが、たとえば、UIViewControllerの-(void)viewDidAppear:(BOOL)animatedから呼び出されると、動作が変化します。具体的には、次のログでデッドロックします。
Begin test on main thread
Waiting for worker
私の質問は、NSRunLoop runModeがこの状況でdispatch_asyncを介して送信されたブロックを処理しないのに、他の状況では処理するのはなぜですか?