iOS筆記---GCD篇(2)

這是GCD的第二篇筆記歹苦,接著前一篇來介紹GCD的使用慢逾。

上一篇說了什么是Dispatch Queue及它的兩種形態(tài)醋闭,這篇記錄下GCD的基本用法。

生成隊列:dispatch_queue_create

通過這個函數(shù)可以生成Dispatch Queue缘揪。

//一個Serial Dispatch Queue
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.wang.MySerialDispatchQueue",NULL)义桂;
//一個Concurrent Dispatch Queue
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.wang.MyConcurrentDispatchQueue"找筝,DISPATCH_QUEUE_CONCURRENT);

第一個參數(shù)可以是NULL慷吊,不過推薦寫個名字袖裕。其作用在于調(diào)試的時候,出現(xiàn)溉瓶,如圖:


第一個參數(shù)名字

第二個參數(shù)是生成Serial Dispatch Queue和Concurrent Dispatch Queue急鳄。
生成Serial時只需將第二個參數(shù)設(shè)置為NULL就可以了谤民。ARC環(huán)境下也無需我們手動釋放了,但非ARC下需要手動釋放:dispatch_release(queue);
前面說過Serial Dispatch Queue只開一個線程疾宏,同時只能執(zhí)行1個追加處理张足。但用dispatch_queue_create函數(shù)可以生成多個Dispatch Queue。這就意味著如果都生成Serial Dispatch Queue坎藐,可以在每一個隊列中都追加任務(wù)为牍,這樣可以開多個線程來執(zhí)行。
比如代碼如下:

dispatch_queue_t queue = dispatch_queue_create("com.wang.MySerialDispatchQueue", NULL);
dispatch_queue_t queue1 = dispatch_queue_create("com.wang.MySerialDispatchQueue1", NULL);
 dispatch_queue_t queue2 = dispatch_queue_create("com.wang.MySerialDispatchQueue2", NULL);
dispatch_queue_t queue3 = dispatch_queue_create("com.wang.MySerialDispatchQueue3", NULL);

建4個岩馍,然后追加Log任務(wù)碉咆。結(jié)果如下:


Log信息

可以看到,每一個Serial Dispatch Queue就開了一個線程蛀恩,這里加上主線程就有5個吟逝。

雖然dispatch_queue_create可以生成多個Dispatch Queue,但是也要注意Serial Dispatch Queue的個數(shù)不要太多赦肋,它和線程是一對一的關(guān)系块攒,如果過多的使用線程,會消耗大量內(nèi)存佃乘,會降低系統(tǒng)的響應(yīng)性能的囱井。并且在多個線程處理更新相同資源的時候會發(fā)生數(shù)據(jù)競爭的。

記錄下《Objective-C高級編程》里所寫:在Serial Dispatch Queue的的生成個數(shù)應(yīng)當(dāng)僅限所必需的數(shù)量趣避。例如更新數(shù)據(jù)庫時1個表生成1個Serial Dispatch Queue庞呕,更新文件時1個文件或是可以分割的1個文件塊生成1個Serial Dispatch Queue。雖然“Serial Dispatch Queue比Concurrent Dispatch Queue能生成更多的線程”程帕,但絕不能激動之下大量生成Serial Dispatch Queue住练。

數(shù)據(jù)競爭問題,如想不發(fā)生而且并行執(zhí)行線程愁拭,就使用Concurrent Dispatch Queue讲逛。

主隊列和全局隊列(Main Dispatch Queue和Global Dispatch Queue)

這兩個隊列是系統(tǒng)本來就提供的隊列,不用再創(chuàng)造了岭埠,能直接將任務(wù)追加到這兩個隊列上執(zhí)行盏混。

主隊列
主隊列是和主線程相關(guān)聯(lián)的隊列,是一個Serial Dispatch Queue惜论。
如果把任務(wù)放到主隊列中進(jìn)行處理许赃,那么不論處理函數(shù)是異步的還是同步的都不會開啟新的線程。

追加到主隊列中的任務(wù)會在主線程中執(zhí)行馆类,因此這里面通常追加一些界面更新的操作混聊。如performSelectorOnMainThread差不多。獲取主隊列的函數(shù)如下:

dispatch_queue_t queue=dispatch_get_main_queue();

主要追加方式:

NSLog(@"這是主線程-----%@",[NSThread currentThread]);
dispatch_async(dispatch_get_main_queue(),^{
      NSLog(@"打印線程-%@",[NSThread currentThread]);
});

結(jié)果:


結(jié)果

全局隊列
另一個系統(tǒng)提供的是全局隊列:Global Dispatch Queue乾巧,它是Concurrent Dispatch Queue句喜。并且還有4個執(zhí)行優(yōu)先級僵闯,分別是高優(yōu)先級(High Priority)、默認(rèn)優(yōu)先級(Default Priority)藤滥、低優(yōu)先級(Low Priority)鳖粟、后臺優(yōu)先級(Background Priority)。

在向全局隊列追加任務(wù)的時候拙绊,應(yīng)選擇與處理內(nèi)容對應(yīng)的執(zhí)行優(yōu)先級向图。

各優(yōu)先級獲取方法:

//Global高優(yōu)先級
dispatch_queue_t globalHigh = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

//Global默認(rèn)優(yōu)先級
dispatch_queue_t globalDefault = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//Global低優(yōu)先級
dispatch_queue_t globalLow = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

//Global后臺優(yōu)先級
dispatch_queue_t globalBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

優(yōu)先級順序從高到低。

優(yōu)先級順序

基本使用

在程序里标沪,就一般使用系統(tǒng)提供的兩個隊列來處理任務(wù)就足夠了榄攀。比如需要在后臺獲取一張網(wǎng)絡(luò)圖片,然后將它顯示到界面上金句,用GCD怎么做檩赢。如下代碼所示:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //獲取全局隊列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //追加下載圖片任務(wù)
    dispatch_async(queue, ^{
        NSLog(@"%@",[NSThread currentThread]);
        //從網(wǎng)絡(luò)上下載圖片
        NSURL *url = [NSURL URLWithString:@"http://ww2.sinaimg.cn/mw690/005ClD7hjw1f29afwpes2j30sg0sgdhx.jpg"];
        NSData *data=[NSData dataWithContentsOfURL:url];
        UIImage *image=[UIImage imageWithData:data];
        NSLog(@"圖片加載完畢");

        //回到主線程刷新界面,就是向主隊列中添加任務(wù)
        dispatch_async(dispatch_get_main_queue(), ^{
              self.imageView.image = image;
              NSLog(@"%@",[NSThread currentThread]);
              });
      });
}

打印結(jié)果:


2-3.png

顯示效果:


顯示效果

OK违寞,GCD的基本使用就是如此贞瞒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趁曼,隨后出現(xiàn)的幾起案子军浆,更是在濱河造成了極大的恐慌,老刑警劉巖挡闰,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乒融,死亡現(xiàn)場離奇詭異,居然都是意外死亡摄悯,警方通過查閱死者的電腦和手機赞季,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奢驯,“玉大人申钩,你說我怎么就攤上這事∵冻鳎” “怎么了典蜕?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長罗洗。 經(jīng)常有香客問我,道長钢猛,這世上最難降的妖魔是什么伙菜? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮命迈,結(jié)果婚禮上贩绕,老公的妹妹穿的比我還像新娘火的。我一直安慰自己,他們只是感情好淑倾,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布馏鹤。 她就那樣靜靜地躺著,像睡著了一般娇哆。 火紅的嫁衣襯著肌膚如雪湃累。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天碍讨,我揣著相機與錄音治力,去河邊找鬼。 笑死勃黍,一個胖子當(dāng)著我的面吹牛宵统,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播覆获,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼马澈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弄息?” 一聲冷哼從身側(cè)響起箭券,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疑枯,沒想到半個月后辩块,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡荆永,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年废亭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片具钥。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡豆村,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骂删,到底是詐尸還是另有隱情掌动,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布宁玫,位于F島的核電站粗恢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏欧瘪。R本人自食惡果不足惜眷射,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妖碉,春花似錦涌庭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冗茸,卻和暖如春席镀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚀狰。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工愉昆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麻蹋。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓跛溉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扮授。 傳聞我的和親對象是個殘疾皇子芳室,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 簡介 GCD(Grand Central Dispatch)是在macOS10.6提出來的,后來在iOS4.0被引...
    sunmumu1222閱讀 868評論 0 2
  • 我們知道在iOS開發(fā)中刹勃,一共有四種多線程技術(shù):pthread堪侯,NSThread,GCD荔仁,NSOperation: ...
    請叫我周小帥閱讀 1,497評論 0 1
  • 背景 擔(dān)心了兩周的我終于輪到去醫(yī)院做胃鏡檢查了伍宦!去的時候我都想好了最壞的可能(胃癌),之前在網(wǎng)上查的癥狀都很相似乏梁。...
    Dely閱讀 9,245評論 21 42
  • 一次洼、GCD的API 1. Dispatch queue 在執(zhí)行處理時存在兩種Dispatch queue: 等待現(xiàn)...
    doudo閱讀 501評論 0 0
  • Grand Central Dispatch(GCD)概要 我的博客鏈接 什么是GCD? 蘋果官方這么描述的:Gr...
    換個名字再說閱讀 1,291評論 4 7