这可能是一个愚蠢的问题,但我需要问一下并为自己澄清一下。
要将一个块提交到队列以进行执行,请使用函数dispatch_sync
和dispatch_async
。它们都接受队列和块作为参数。dispatch_async
立即返回,异步运行块,而dispatch_sync
阻止执行,直到提供的块返回为止。以下是一些情况:
情况1
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
[self goDoSomethingLongAndInvolved];
dispatch_async(queue, ^{
NSLog(@"this is statement1");
});
});
情况2
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_sync(queue, ^{
[self goDoSomethingLongAndInvolved];
dispatch_sync(queue, ^{
NSLog(@"this is statement1");
});
});
情境 3
{
[super viewDidLoad];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
[self goDoSomethingLongAndInvolved];
dispatch_sync(queue, ^{
NSLog(@"this is statement1");
});
});
情境 4
{
[super viewDidLoad];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_sync(queue, ^{
[self goDoSomethingLongAndInvolved];
dispatch_async(queue, ^{
NSLog(@"this is statement1");
});
});
而 goDoSomethingLongAndInvolved
是
-(void)goDoSomethingLongAndInvolved {
NSLog(@"goDoSomethingLongAndInvolved");
}
我尝试在Xcode中运行它们,但是我根本看不出任何区别。
所以我的问题是:
- 这些情况的主要区别是什么?
- 如果我使用
dispatch_get_main_queue()
替换queue
会怎样?
goDoSomethingLongAndInvolved
方法只需要几纳秒,如果你看不到速度差异我也不感到意外。 - davidf2281