确保我正确解释嵌套的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()
仅阻止运行队列的线程。