tra*_*uan 20 iphone objective-c grand-central-dispatch ios objective-c-blocks
这可能是一个愚蠢的问题,但我需要为自己提出并清楚这一点.
要将块提交到队列以供执行,请使用函数dispatch_sync和dispatch_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");
    });
});
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");
    });
});
{
    [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");
        });
    });
{
    [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中运行它们,但我根本看不出它们的区别.
所以我的问题是:
queue用dispatch_get_main_queue()?dre*_*zor 16
该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); 
    }
}
无论是否等待,您都会清楚地看到每次发生的事情.祝好运.
| 归档时间: | 
 | 
| 查看次数: | 5304 次 | 
| 最近记录: |