22

这可能是一个愚蠢的问题,但我需要自己问清楚。

要将块提交到队列中执行,请使用函数dispatch_syncdispatch_async。它们都将队列和块作为参数。dispatch_async立即返回,异步运行块,同时dispatch_sync阻止执行,直到提供的块返回。以下是一些情况:

情况一

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 中运行它们,但我根本看不出有什么区别。

所以我的问题是:

  1. 这些情况之间的主要区别是什么?
  2. 如果我用 替换queue怎么dispatch_get_main_queue()办?
4

1 回答 1

17

dispatch_sync语句一直等到它覆盖的块被完全执行。dispatch_async立即返回并继续执行下一行代码,所以里面的一切都是并行发生的。

如果queue是自己创建的串行队列,那么:

情况 1 - 根块立即返回。在它内部等待 [self go....],然后进入 dispatch_async,它也立即返回。

情况 2 - 如果queue是串行队列,则将出现死锁,因为它将等待自己完成执行。由于您正在处理异步块,因此该块将并行执行。(谢谢,@Ken Thomases)

情况 3 - 这里不需要dispatch_sync。它会导致死锁。

情况 4 - 等待 [self ...],然后立即返回。

如果您queue用主队列替换,请记住不要dispatch_sync在主队列上,因为它会导致死锁(如果不是从主线程分派,则不会,感谢@Ken Thomases)。

为了更好地理解它,请将您的函数替换为:

-(void)goDoSomethingLongAndInvolved:(NSString *)message {
    for(int i = 0; i < 50; ++i) {
        NSLog(@"%@ -> %d", message, i); 
    }
}

无论是否等待,您都会清楚地看到每次发生了什么。祝你好运。

于 2013-08-15T22:06:50.903 回答