我创建了一个这样的串行队列:
dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL);
什么之间的差异dispatch_async
被称为像这样
dispatch_async(_serialQueue, ^{ /* TASK 1 */ });
dispatch_async(_serialQueue, ^{ /* TASK 2 */ });
并dispatch_sync
在此串行队列中这样调用?
dispatch_sync(_serialQueue, ^{ /* TASK 1 */ });
dispatch_sync(_serialQueue, ^{ /* TASK 2 */ });
我的理解是,无论使用哪种调度方法,TASK 1
都将在执行之前完成并TASK 2
正确吗?
是。使用串行队列可确保任务的串行执行。唯一的区别是,dispatch_sync
仅在块完成后dispatch_async
返回,而将其添加到队列后可能未完成才返回。
对于此代码
dispatch_async(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_async(_serialQueue, ^{ printf("3"); });
printf("4");
它可以打印2413
或2143
或1234
却1
总是前3
对于此代码
dispatch_sync(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_sync(_serialQueue, ^{ printf("3"); });
printf("4");
它总是打印 1234
注意:对于第一个代码,它将不会打印1324
。因为在执行后被printf("3")
调度。任务只有在分派后才能执行。 printf("2")
任务的执行时间不变。此代码始终打印12
dispatch_async(_serialQueue, ^{ sleep(1000);printf("1"); });
dispatch_async(_serialQueue, ^{ printf("2"); });
可能发生的是
你总是看到 12
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句