使用GCD開發(fā)的基本思路
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比寶塔網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式寶塔網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋寶塔地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。基本思想:將任務(wù)(操作)放在隊(duì)列中去執(zhí)行
任務(wù)使用block定義
隊(duì)列負(fù)責(zé)調(diào)度任務(wù)執(zhí)行所在的線程以及具體的執(zhí)行時(shí)間
隊(duì)列的特點(diǎn)是先進(jìn)先出(FIFO)的,新添加至隊(duì)列的操作都會(huì)排在隊(duì)尾.
GCD的函數(shù)都是以dispatch開頭的
注意 :隊(duì)列不是線程,也不對(duì)應(yīng)CPU。
隊(duì)列:dispatch_queue_t
兩種隊(duì)列:串行隊(duì)列、并行隊(duì)列
隊(duì)列上的操作:添加任務(wù)
兩種任務(wù):同步任務(wù)、異步任務(wù)
隊(duì)列及任務(wù)
GCD的串行隊(duì)列,意味著隊(duì)列中的任務(wù)排隊(duì)執(zhí)行
1)添加異步任務(wù):創(chuàng)建一個(gè)線程,所有被添加的任務(wù)排隊(duì)執(zhí)行
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_SERIAL); for ( int i=0; i<10; i++) { dispatch_async(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); }
2)添加同步任務(wù):不創(chuàng)建線程,任務(wù)在當(dāng)前線程中執(zhí)行,極少使用
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_SERIAL); dispatch_sync(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); });
CGD并行隊(duì)列,意味著隊(duì)列中任務(wù)不會(huì)排隊(duì)執(zhí)行,隨機(jī)執(zhí)行
1)添加異步任務(wù):會(huì)創(chuàng)建線程,個(gè)數(shù)不確定,任務(wù)的先后順序不確定
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_CONCURRENT); dispatch_async(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); });
2)添加同步任務(wù):不會(huì)創(chuàng)建線程,極少使用
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_CONCURRENT); dispatch_sync(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); });
無論什么隊(duì)列和什么任務(wù),線程的創(chuàng)建和回收都不需要程序員參與,線程的創(chuàng)建和回收是由隊(duì)列負(fù)責(zé)的
全局隊(duì)列
GCD的最常用隊(duì)列是全局隊(duì)列和主隊(duì)列,這兩種隊(duì)列不需要?jiǎng)?chuàng)建,是每個(gè)App都具有的
獲得全局隊(duì)列
dispatch_queue_t dispatch_get_global_queue( long identifier, unsigned long flags);
flags參數(shù):保留參數(shù),傳0即可
identifier參數(shù):用于指定使用哪種全局隊(duì)列
四種全局隊(duì)列:
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 //高優(yōu)先級(jí)
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 //默認(rèn)優(yōu)先級(jí)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) //低優(yōu)先級(jí)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN //最低的后臺(tái)優(yōu)先級(jí)
全局隊(duì)列是系統(tǒng)的,拿過來直接用即可,都是并行隊(duì)列
添加異步任務(wù),會(huì)創(chuàng)建多個(gè)線程,任務(wù)無須執(zhí)行
添加同步任務(wù),不會(huì)創(chuàng)建新線程,任務(wù)排序執(zhí)行
主隊(duì)列
每一個(gè)應(yīng)用程序都只有一個(gè)主線程,在iOS開發(fā)中,所有UI的更新操作,都必須在主線程中去做
獲得主隊(duì)列:
dispatch_queue_t dispatch_get_main_queue(void);
主隊(duì)列也是系統(tǒng)的,拿過來直接用即可,添加的任務(wù)都會(huì)在主線程終止hi性
添加異步任務(wù):在主線程中順序執(zhí)行,無異步效果
添加同步任務(wù):任務(wù)不會(huì)執(zhí)行
常見的用法:
如果一個(gè)任務(wù)想要在后臺(tái)(子線程)執(zhí)行,則使用全局隊(duì)列添加異步任務(wù)
如果一個(gè)任務(wù)想要在主線程執(zhí)行,則使用主隊(duì)列添加同步任務(wù)
異步下載圖片
這是一類最常見的做法,在子線程中請(qǐng)求數(shù)據(jù),完成后回到主線程中更新相關(guān)的UI元素
GCD的一些其他常用操作
1)任務(wù)的延遲執(zhí)行
dispatch_after函數(shù)會(huì)延遲將一個(gè)block任務(wù)添加到隊(duì)列中
void dispatch_after( dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);
在Xcode中,通過快捷鍵補(bǔ)全的代碼:
delayInSeconds:延遲的秒數(shù)
使用的主隊(duì)列,即延遲的任務(wù)在主線程中執(zhí)行
最后的block,即任務(wù)代碼
2)任務(wù)的多次執(zhí)行
dispatch_apply函數(shù)將一個(gè)任務(wù)放到隊(duì)列中多次執(zhí)行
具體是串行執(zhí)行還是并行執(zhí)行是由具體的隊(duì)列決定。
dispatch_apply不會(huì)立刻返回,在執(zhí)行完畢后才返回,是同步的調(diào)用
void dispatch_apply( size_t iterations, dispatch_queue_t queue, void (^block)( size_t));
iteractions:執(zhí)行的次數(shù)
queue:隊(duì)列,一般使用全局隊(duì)列
block:任務(wù)代碼
應(yīng)用場(chǎng)景:將關(guān)系不緊密的循環(huán)操作放到后臺(tái)運(yùn)行
3)保證任務(wù)只執(zhí)行一次
在多線程的環(huán)境下,同故宮dispatch_once()保證一個(gè)任務(wù)只會(huì)執(zhí)行一次
在Xcode中,通過快捷鍵補(bǔ)全的代碼:
在block中添加任務(wù)代碼即可
應(yīng)用場(chǎng)景:?jiǎn)卫龑?duì)象的創(chuàng)建
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。