有时候会遇到sync,async对dispatch_get_main_queue,dispatch_queue_create, dispatch_get_global_queue的搭配不是特别的清楚,所以也简单的总结了下。
dispatch_async(异步)和dispatch_sync(同步):决定有没有开子线程的能力,而不是指会不会开子线程。
queue 决定有没有并发的能力。开子线程我就并发,不开就串行。
总结
dispatch_async(异步)有开子线程能力。
dispatch_sync(同步)没有开子线程能力。
1:dispatch_get_main_queue
都在主线程中按顺序执行(比较特殊);
2:dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
有并发能力
3:dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
没并发能力(串);
4:dispatch_get_global_queue
有并发能力;
dispatch_async各种搭配后代码块中代码在什么线程中,怎样执行。
1:dispatch_async 和 dispatch_get_main_queue
有开子线程的能力,在主线程中执行。
结果:主线程中按顺序执行。
2:dispatch_async 和 dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
有开子线程的能力,有并发的能力。
结果:子线程并发执行。
3:dispatch_async 和 dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
有开子线程能力,串行执行
结果:子线程串行执行。
4:dispatch_async 和 dispatch_get_global_queue
有开子线程能力,有并发执行能力
结果:子线程并发执行。
dispatch_sync各种搭配后代码块中代码在什么线程中,怎样执行。
1:dispatch_sync 和 dispatch_get_main_queue
没有开子线程的能力,在主线程中执行。
结果:
若当前线程为主线程,则死锁崩溃(后面细说)
若当前线程为子线程,则在子线程中串行执行。
2:dispatch_sync 和 dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
没有开子线程的能力,有并发的能力。
结果:当前线程中串行执行。
3:dispatch_sync 和 dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
没有开子线程能力,串行执行
结果:当前线程中串行执行。
4:dispatch_sync 和 dispatch_get_global_queue
没有开子线程能力,有并发执行能力
结果:当前线程中串行执行。
注意:上文提到"当前线程"表示当前dispatch_sync或者dispatch_async的代码在什么线程中执行并不确定,所以代码块中的内容在子线程/主线程中执行并不确定。
dispatch_sync 和 dispatch_get_main_queue搭配为什么会造成死锁呢?请看下一篇文章。
有什么错误欢迎批评指正 。