1 GCD提供兩種類型的queue,在
dispatch_queue_t queue = dispatch_queue_create(<#const char * _Nullable label#>, <#dispatch_queue_attr_t _Nullable attr#>)
第一個參數(shù)一般使用逆序全稱域eg: com.example.customtypeQueue,第二個參數(shù)使用DISPATCH_QUEUE_SERIAL 或者 DISPATCH_QUEUE_CONCURRENT,一般只在引起資源競爭的操作是使用 DISPATCH_QUEUE_SERIAL類型的queue 來避免資源競爭,大部分情況下依然使用DISPATCH_QUEUE_CONCURRENT類型的queue.同步執(zhí)行為順序執(zhí)行,按照添加任務(wù)的先后順序順序執(zhí)行,并行執(zhí)行不按照先后順序,同時執(zhí)行多個任務(wù),
1 當(dāng)向serial類型的queue使用dispatch_asyn多次添加任務(wù)后,任務(wù)的執(zhí)行會按照添加的先后順序順序執(zhí)行(串行),但是,當(dāng)創(chuàng)建多個serial類型的queue時,并且給每個queue分別添加任務(wù)后,這些任務(wù)的執(zhí)行順序是不分先后的,即多個serial類型的queue之間依然是并行執(zhí)行,互不影響;
(在手動創(chuàng)建的串行隊列中添加異步(并發(fā))執(zhí)行的任務(wù),任務(wù)的執(zhí)行也是同步執(zhí)行)
2 當(dāng)向同一個concurrent類型的queue使用dispatch_asyn添加多個任務(wù)后,這些任務(wù)的執(zhí)行是并行執(zhí)行的;
(當(dāng)向手動創(chuàng)建的并行隊列中添加異步執(zhí)行的任務(wù),任務(wù)的執(zhí)行是并行執(zhí)行,多個任務(wù)之間部分先后順序)
3 當(dāng)向serial類型的queue使用sipatch_syn多次添加任務(wù)后,任務(wù)的執(zhí)行按添加任務(wù)的先后順序串行執(zhí)行;
(當(dāng)想手動創(chuàng)建的串行行隊列中添加同步執(zhí)行的任務(wù),任務(wù)的執(zhí)行仍然是同步執(zhí)行)
4 當(dāng)向concurrent類型的queue使用dispatch_syn添加多個任務(wù)時,多個任務(wù)依然是按照添加的先后順序串行執(zhí)行.
(當(dāng)向手動創(chuàng)建的并行隊列中添加同步執(zhí)行的任務(wù),任務(wù)的執(zhí)行是同步執(zhí)行)
除了使用自己創(chuàng)建的queue外,我們還可以使用系統(tǒng)提供的queue,dispatch_get_main_queue()方法獲得當(dāng)前程序的主線程,主線程只有一個,值得注意的是該線程屬于DISPATCH_QUEUE_SERIAL類型,使用方法參考上述四點,另外還有dispatch_get_gloabal_queue(DISPATCH_QUEUE_PRIORITY_四種優(yōu)先級,0)方法可以獲得系統(tǒng)提供的四中不同優(yōu)先級的queue,這四種類型的queue是DISPATCH_QUEUE_CONCURRENT類型,使用方法參考上述四點.
另外,OC中的三種暫停方法:sleep()函數(shù)和 [NSThread sleepForTimeInterval:]方法影響的是該函數(shù)所處的線程,并不一定是主線程 dispatch_after 方法一定是延遲的主線程類似于performSelector方法,使用NSTimer方法控制暫停在此就不過多描述了,網(wǎng)上很多. 后續(xù)會再次補上有關(guān)GCD更多的使用方法
//dispatch_set_target_queue
dispatch_set_target_queue(queue1, targetQueue)方法將制定queue的優(yōu)先級設(shè)置為targetQueue一樣的queue,若targetQueue的類型SERIAL,則根據(jù)該方法設(shè)置過的queue的先后順序,順序執(zhí)行所有被設(shè)置過的queue,若掛起某一個queue,則其他queue的執(zhí)行受阻;若targetQueue的類型為CONCURRENT類型,則并行執(zhí)行所有被設(shè)置過的queue,若掛起某一個queue,不影響其他queue的執(zhí)行.(線程掛起與恢復(fù)的方法:
//掛起
dispatch_suspend(<#dispatch_object_t _Nonnull object#>)
//恢復(fù)
dispatch_resume(<#dispatch_object_t _Nonnull object#>)
)dispatch_set_target_queue(queue1,targetQueue);
dispatch_set_target_queue(queue2,targetQueue);
dispatch_set_target_queue(queue3,targetQueue);
新聞熱點
疑難解答