有時(shí)候會(huì)遇到sync,async對(duì)dispatch_get_main_queue,dispatch_queue_create, dispatch_get_global_queue的搭配不是特別的清楚,所以也簡(jiǎn)單的總結(jié)了下。
dispatch_async(異步)和dispatch_sync(同步):決定有沒有開子線程的能力,而不是指會(huì)不會(huì)開子線程。
queue 決定有沒有并發(fā)的能力。開子線程我就并發(fā),不開就串行。
總結(jié)
dispatch_async(異步)有開子線程能力。
dispatch_sync(同步)沒有開子線程能力。
1:dispatch_get_main_queue
都在主線程中按順序執(zhí)行(比較特殊);
2:dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
有并發(fā)能力
3:dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
沒并發(fā)能力(串);
4:dispatch_get_global_queue
有并發(fā)能力;
dispatch_async各種搭配后代碼塊中代碼在什么線程中,怎樣執(zhí)行。
1:dispatch_async 和 dispatch_get_main_queue
有開子線程的能力,在主線程中執(zhí)行。
結(jié)果:主線程中按順序執(zhí)行。
2:dispatch_async 和 dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
有開子線程的能力,有并發(fā)的能力。
結(jié)果:子線程并發(fā)執(zhí)行。
3:dispatch_async 和 dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
有開子線程能力,串行執(zhí)行
結(jié)果:子線程串行執(zhí)行。
4:dispatch_async 和 dispatch_get_global_queue
有開子線程能力,有并發(fā)執(zhí)行能力
結(jié)果:子線程并發(fā)執(zhí)行。
dispatch_sync各種搭配后代碼塊中代碼在什么線程中,怎樣執(zhí)行。
1:dispatch_sync 和 dispatch_get_main_queue
沒有開子線程的能力,在主線程中執(zhí)行。
結(jié)果:
若當(dāng)前線程為主線程,則死鎖崩潰(后面細(xì)說)
若當(dāng)前線程為子線程,則在子線程中串行執(zhí)行。
2:dispatch_sync 和 dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT)
沒有開子線程的能力,有并發(fā)的能力。
結(jié)果:當(dāng)前線程中串行執(zhí)行。
3:dispatch_sync 和 dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL)
沒有開子線程能力,串行執(zhí)行
結(jié)果:當(dāng)前線程中串行執(zhí)行。
4:dispatch_sync 和 dispatch_get_global_queue
沒有開子線程能力,有并發(fā)執(zhí)行能力
結(jié)果:當(dāng)前線程中串行執(zhí)行。
注意:上文提到"當(dāng)前線程"表示當(dāng)前dispatch_sync或者dispatch_async的代碼在什么線程中執(zhí)行并不確定,所以代碼塊中的內(nèi)容在子線程/主線程中執(zhí)行并不確定。
dispatch_sync 和 dispatch_get_main_queue搭配為什么會(huì)造成死鎖呢?請(qǐng)看下一篇文章。
有什么錯(cuò)誤歡迎批評(píng)指正 。