GCD 使用方法
????串行(Serial)
你可以創(chuàng)建任意個數(shù)的串行隊列,每個隊列依次執(zhí)行添加的任務(wù),一個隊列同一時刻只能執(zhí)行一個任務(wù)(串行),但是各個隊列之間不影響,可以并發(fā)執(zhí)行。每個隊列中的任務(wù)運行在一個由各自串行隊列維護(hù)的獨立線程上,一個隊列中只有一個線程。 下面,我將創(chuàng)建一個串行隊列,添加兩個任務(wù),來演示串行執(zhí)行的過程。 1 UInt32 loopCount = 1000; 2 3 void (^taskFirst)(void) = ^{ 4 NSLog(@"taskFirst 任務(wù)開始執(zhí)行\(zhòng)r\n"); 5 6 for (UInt32 i = 0; i < loopCount; i++) { 7 8 } 9 NSLog(@"taskFirst 任務(wù)結(jié)束\r\n"); 10 }; 11 12 void (^taskSecond)(void) = ^{ 13 NSLog(@"taskSecond任務(wù)開始執(zhí)行\(zhòng)r\n"); 14 for (UInt32 i = 0; i < loopCount; i ++) { 15 16 } 17 NSLog(@"taskSecond 任務(wù)結(jié)束\r\n"); 18 }; 19 dispatch_queue_t serialQueue; 20 serialQueue = dispatch_queue_create("serialDemo", NULL); 21 dispatch_async(serialQueue, taskFirst); 22 NSLog(@"taskfirst 已經(jīng)加入隊列\(zhòng)r\n"); 23 dispatch_async(serialQueue, taskSecond); 24 NSLog(@"tasksecond 已經(jīng)加入隊列\(zhòng)r\n");運行得到結(jié)果1:
2012-05-14 18:45:01.766 GDCDemo[389:f803] taskfirst?已經(jīng)加入隊列
2012-05-14 18:45:01.766 GDCDemo[389:11103] taskFirst?任務(wù)開始執(zhí)行
2012-05-14 18:45:01.767 GDCDemo[389:f803] tasksecond?已經(jīng)加入隊列
2012-05-14 18:45:01.768 GDCDemo[389:11103] taskFirst?任務(wù)結(jié)束
2012-05-14 18:45:01.768 GDCDemo[389:11103] taskSecond任務(wù)開始執(zhí)行
2012-05-14 18:45:01.772 GDCDemo[389:11103] taskSecond?任務(wù)結(jié)束
運行結(jié)果跟我們的預(yù)計一樣,taskFirst執(zhí)行完之后,才執(zhí)行taskSecond。而且,通過“xxx任務(wù)加入隊列”的提示,任務(wù)運行的線程跟主線程不是同一個。
下面,我們繼續(xù)對代碼做點調(diào)整,讓它演示不同隊列之間的任務(wù)并行運行。
1 UInt32 loopCount = 1000; 2 UInt32 loopCountFirst = 10000000; 3 4 void (^taskFirst)(void) = ^{ 5 NSLog(@"taskFirst 任務(wù)開始執(zhí)行\(zhòng)r\n"); 6 7 //延長taskFirst的運行時間 8 for (UInt32 i = 0; i < loopCountFirst; i++) { 9 10 } 11 NSLog(@"taskFirst 任務(wù)結(jié)束\r\n"); 12 }; 13 14 void (^taskSecond)(void) = ^{ 15 NSLog(@"taskSecond任務(wù)開始執(zhí)行\(zhòng)r\n"); 16 for (UInt32 i = 0; i < loopCount; i ++) { 17 18 } 19 NSLog(@"taskSecond 任務(wù)結(jié)束\r\n"); 20 }; 21 dispatch_queue_t serialQueue; 22 serialQueue = dispatch_queue_create("serialDemo", NULL); 23 //創(chuàng)建第二個隊列 24 dispatch_queue_t serialQueueSecond = dispatch_queue_create("serialSecondDemo", NULL); 25 dispatch_async(serialQueue, taskFirst); 26 NSLog(@"taskfirst 已經(jīng)加入隊列\(zhòng)r\n"); 27 dispatch_async(serialQueueSecond, taskSecond); 28 NSLog(@"tasksecond 已經(jīng)加入隊列\(zhòng)r\n");運行得到結(jié)果2:
2012-05-14 19:07:22.951 GDCDemo[456:f803] taskfirst?已經(jīng)加入隊列
2012-05-14 19:07:22.951 GDCDemo[456:11103] taskFirst?任務(wù)開始執(zhí)行
2012-05-14 19:07:22.953 GDCDemo[456:f803] tasksecond?已經(jīng)加入隊列
2012-05-14 19:07:22.953 GDCDemo[456:12c03] taskSecond任務(wù)開始執(zhí)行
2012-05-14 19:07:22.954 GDCDemo[456:12c03] taskSecond?任務(wù)結(jié)束
2012-05-14 19:07:22.977 GDCDemo[456:11103] taskFirst?任務(wù)結(jié)束
由此可見,taskSecond是添加到隊列后立即執(zhí)行的。兩個串行隊列之間的任務(wù)是互不影響的。
?
????并行(Concurrent)
并行隊列是不允許自己創(chuàng)建的,系統(tǒng)中存在三個不同優(yōu)先級的并行隊列。并行隊列依舊按照任務(wù)添加的順序啟動任務(wù),但是,后一個任務(wù)無須等待前一個任務(wù)執(zhí)行完畢,而是啟動第一個任務(wù)后,立即啟動下一個任務(wù)。至于同一時刻允許同時運行多少個任務(wù)有系統(tǒng)決定。任務(wù)各自運行在并行隊列為他們提供的獨立線程上,并行隊列中同時運行多少個任務(wù),就必須維護(hù)多少個線程。 下面,我們將上一個程序的第21到28行替換為如下代碼: 1 dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 2 dispatch_async(concurrentQueue, taskFirst); 3 NSLog(@"taskfirst 已經(jīng)加入隊列\(zhòng)r\n"); 4 dispatch_async(concurrentQueue, taskSecond); 5 NSLog(@"tasksecond 已經(jīng)加入隊列\(zhòng)r\n");運行,結(jié)果與結(jié)果2相同。說明了,taskFirst和taskSecond是同時運行的。
????主調(diào)度隊列(main dispatch queue)
主調(diào)度隊列中的任務(wù)運行在應(yīng)用程序主線程上,所以,如果你要修改應(yīng)用程序的界面,他是唯一的選擇。 演示代碼如下:?dispatch_async(dispatch_get_main_queue(), ^{
????????.....//跟新界面的操作
????});
博客內(nèi)容是我學(xué)習(xí)的總結(jié),如果有錯誤,希望大家指出。原文:http://www.cnblogs.com/touchme/archive/2012/05/14/2499630.html
轉(zhuǎn)載于:https://www.cnblogs.com/zsw-1993/archive/2013/01/05/4880551.html
總結(jié)
- 上一篇: html5开发windows8应用 wi
- 下一篇: 使用 Microsoft Ajax Li