有時候會遇到sync鼻种,async對dispatch_get_main_queue,dispatch_queue_create, dispatch_get_global_queue的搭配不是特別的清楚,所以也簡單的總結(jié)了下占贫。
dispatch_async(異步)和dispatch_sync(同步):決定有沒有開子線程的能力每窖,而不是指會不會開子線程。
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搭配為什么會造成死鎖呢漱逸?請看下一篇文章泪姨。
有什么錯誤歡迎批評指正 游沿。