确保我正确解释嵌套的GCD

所以我使用dispatch_async将10个任务放在并发队列上 。 它们不会阻止下一个任务,并按顺序处理。 我的用户界面很敏感。

for (int i = 0; i < 10; i++) { dispatch_async(concurrencyQueue, ^() { NSLog(@"..calling insertion method to insert record %d", i); dispatch_sync(serialQueue, ^() { //this is to simulate writing to database NSLog(@"----------START %d---------", i); [NSThread sleepForTimeInterval:1.0f]; NSLog(@"--------FINISHED %d--------", i); }); }); } 

在每个任务中,我们通过dispatch_sync串行队列上模拟对数据库的写入“1秒hibernate”。

我一直认为dispatch_sync阻止每个人,并同步它的任务,因为这是我单独使用它时的行为方式。 但是,在这种情况下,它不会阻止主线程。 相反,它像我想要的那样在后台运行得很漂亮。

是因为与队列关联的任何线程都受到影响吗?

例如,主线程通过dispatch_async执行并发队列,这就是它不被阻止的原因。

dispatch_sync仅针对在并发队列上工作的后台线程进行同步和阻塞。 因此,dispatch_sync与后台线程相关联,因此永远不会影响我的UI主线程。

我的想法是否正确?

谢谢!

您永远不会阻塞主线程,因为您的代码在concurrencyQueue的线程或serialQueue的线程上serialQueue 。 这些都不是主线。

所有的sleep调用都是在serialQueue的线程上serialQueue 。 所以它是被阻止的serialQueue的线程。

但是,由于您使用dispatch_sync调度到serialQueue ,因此您还会阻塞并发队列的每个线程。 如果在调用dispatch_sync之后添加另一个NSLog ,则可以更好地描绘这一点。

 for (int i = 0; i < 10; i++) { dispatch_async(concurrencyQueue, ^() { NSLog(@"..calling insertion method to insert record %d", i); dispatch_sync(serialQueue, ^() { //this is to simulate writing to database NSLog(@"----------START %d---------", i); [NSThread sleepForTimeInterval:1.0f]; NSLog(@"--------FINISHED %d--------", i); }); NSLog(@"..called insertion method to insert record %d", i); }); } 

dispatch_sync之后的第二个NSLog将更好地向您展示dispatch_sync如何影响对dispatch_async的调用。

你是对的。 dispatch_sync()仅阻止运行队列的线程。