序言:dispatch_queue_create函數(shù)生成的dispatch queue不管是serial 還是concurrent,都使用與默認(rèn)優(yōu)先級Global Dispatch Queue相同的執(zhí)行優(yōu)先級。而要變更生成的dispatch queue的執(zhí)行優(yōu)先級要使用dispatch_set_target_queue函數(shù)。
Snip20170510_1.png
注意:如果第一個參數(shù)不能指定為是系統(tǒng)提供的Main dispatch queue或者Global dispatch queue;
- 該函數(shù)還有一個重要的作用就是可以改變dispatch queue的執(zhí)行階層。
在必須將不可并行執(zhí)行的處理追加到多個serial dispatch queue中時,如果使用dispatch_set_target_queue函數(shù)將目標(biāo)指定為某一個serial dispatch queue,即可防止處理并行執(zhí)行。
{
//目標(biāo)隊列
dispatch_queue_t targetQueue = dispatch_queue_create("target", DISPATCH_QUEUE_SERIAL);
//可以并發(fā)執(zhí)行的串行隊列
dispatch_queue_t q1 = dispatch_queue_create("x", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t q2 = dispatch_queue_create("xx", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t q3 = dispatch_queue_create("xxx", DISPATCH_QUEUE_SERIAL);
//指定目標(biāo)隊列
dispatch_set_target_queue(q1, targetQueue);
dispatch_set_target_queue(q2, targetQueue);
dispatch_set_target_queue(q3, targetQueue);
dispatch_async(q1, ^{
//code
});
dispatch_async(q2, ^{
//code
});
dispatch_async(q3, ^{
//code
});
}
注意:
serial disPatch queue是一個串行隊列,只能同時執(zhí)行1個追加處理(即任務(wù)),當(dāng)用dispatch_queue_create函數(shù)生成多個serial disPatch queue時,每個serial disPatch queue均獲得一個線程,即多個serial disPatch queue可并發(fā)執(zhí)行,同時處理添加到各個serial disPatch queue中的任務(wù),但要注意如果過多地使用多線程,就會消耗大量內(nèi)存,引起大量的上下文切換,大幅度降低系統(tǒng)的響應(yīng)性能,所以我們只在為了避免多個線程更新相同資源導(dǎo)致數(shù)據(jù)競爭時,使用serial disPatch queue
