GCD (一)

GCD (一)

GCD中有三種隊列類型:

  1. The main queue:跟主線程功能相同钱磅,在實際運用的時候揍堰,提交到main queue的任務會在主線程里面執(zhí)行怕敬。main queue可以調用dispatch_get_main_queue()來獲得柒凉。因為main queue是跟主線程相關的,因此我們可以知道這事一個串行隊列债朵。
  2. Global queues:全局隊列是并發(fā)隊列子眶,并由整個進程共享。進程中存在三個全局隊列優(yōu)先級:高序芦,中(default)臭杰,低。
  3. 用戶隊列:用戶隊列是用函數(shù) dispatch_queue_create 創(chuàng)建的谚中,這些隊列是串行的渴杆,可以用來完成同步執(zhí)行寥枝,有點像操作系統(tǒng)里面的互斥。

創(chuàng)建隊列

要使用用戶隊列的時候我們要調用函數(shù)來創(chuàng)建一個磁奖。

dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>);

函數(shù)的第一個屬性是一個標簽囊拜,是為了debug用的,最好用倒置域名來命名隊列点寥。第二個參數(shù)沒用艾疟,現(xiàn)在傳入NULL就可以了

提交作業(yè)(Job)

向一個隊列提交作業(yè)很簡單:調用 dispatch_async 函數(shù),傳入一個隊列跟block敢辩。

//異步
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self dosomeThing];
        NSLog(@"dispatch_async in ViewDidLoad");
        
        //一般在執(zhí)行完job任務之后蔽莱,可能會刷新界面,這時候會回到主線程
        dispatch_async(dispatch_get_main_queue(), ^{
           
            //更新一下你的界面咯
            NSLog(@"update UI in main_queue");
        });
    });

dispatch_async 會直接返回戚长,block會在后臺異步執(zhí)行盗冷。

//同步
    //會等待block里面的代碼執(zhí)行完之后再返回
    //利用__block修飾符,可以從block 里面獲取一個值同廉,活著從界面控制獲取一個值
    __block NSString *str ;
    dispatch_sync(dispatch_get_main_queue(), ^{
        str = [_myLabel.text copy];
        
    });
    
    //利用嵌套的block來中止后臺線程仪糖,然后從主線程中獲取值,在交給后臺進程處理
    dispatch_queue_t bgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(dispatch_get_main_queue(), ^{
       
        NSString *str = [_myLabel.text copy];
        dispatch_async(bgQueue, ^{
           //use
            
        });
        
    });

有異步迫肖,那么就肯定同步锅劝,這個函數(shù)會一步一步執(zhí)行,就是她會等待block的代碼完成之后蟆湖,才會執(zhí)行函數(shù)后面的代碼故爵。


不再適用鎖(Lock)

在這里,我先解釋一下dispatch_sync 和 dispatch_async 的工作流程

dispatch_sync(queue, block) 做了兩件事情

* 將block添加到queue 隊列中隅津;
* 阻塞調用這個函數(shù)的進程诬垂,等待block執(zhí)行完畢,再返回調用進程伦仍。

dispatch_async(queue, block) 也做了兩件事情

* 將block添加到queue 隊列中结窘;
* 直接回到調用線程(這時候就不阻塞了)

那我們怎么實現(xiàn)同步鎖呢?
其實只需要我們的數(shù)據(jù)在同一個串行同步隊列里面執(zhí)行就可以了充蓝。

為了實現(xiàn)這樣的功能隧枫,我們就需要DISPATCH_QUEUE_SERIAL 隊列,也就是用戶隊列谓苟。

_syncQueue = dispatch_queue_create("com.kingandyoga.syncQueue", NULL);

//get 方法
- (NSString *)someString
{
    __weak NSString *localSomeString;
    dispatch_sync(_syncQueue, ^{
        localSomeString = _someString;
    });
    return localSomeString;
}

//set 方法
- (void)setSomeString:(NSString *)someString
{
    dispatch_sync(_syncQueue, ^{
        _someString = someString;
    });
}

然而設置方法不一定非得是同步的官脓,設置實例變量的 block 沒有返回值,所以可以將此方法改成異步:

- (void)setSomeString:(NSString *)someString
{
    dispatch_async(_syncQueue, ^{
        _someString = someString;
    });
}

這次只是把 dispatch_sync 改成 dispatch_async娜谊,從調用者來看提升了執(zhí)行速度确买。但正是由于執(zhí)行異步派發(fā)
dispatch_async 時會拷貝 block斤讥,當拷貝 block 的時間大于執(zhí)行 block 的時間時纱皆,dispatch_async 的速度會比 dispatch_sync 速度更慢湾趾。所以實際情況應根據(jù) block 所執(zhí)行任務的繁重程度來決定使用 dispatch_async 還是 dispatch_sync。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末派草,一起剝皮案震驚了整個濱河市搀缠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌近迁,老刑警劉巖艺普,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鉴竭,居然都是意外死亡歧譬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門搏存,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑰步,“玉大人,你說我怎么就攤上這事璧眠∷踅梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵责静,是天一觀的道長袁滥。 經常有香客問我,道長灾螃,這世上最難降的妖魔是什么题翻? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮睦焕,結果婚禮上藐握,老公的妹妹穿的比我還像新娘。我一直安慰自己垃喊,他們只是感情好猾普,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著本谜,像睡著了一般初家。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乌助,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天溜在,我揣著相機與錄音,去河邊找鬼他托。 笑死掖肋,一個胖子當著我的面吹牛,可吹牛的內容都是我干的赏参。 我是一名探鬼主播志笼,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼沿盅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纫溃?” 一聲冷哼從身側響起腰涧,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎紊浩,沒想到半個月后窖铡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡坊谁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年费彼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片口芍。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡敌买,死狀恐怖,靈堂內的尸體忽然破棺而出阶界,到底是詐尸還是另有隱情虹钮,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布膘融,位于F島的核電站芙粱,受9級特大地震影響,放射性物質發(fā)生泄漏氧映。R本人自食惡果不足惜春畔,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岛都。 院中可真熱鬧律姨,春花似錦、人聲如沸臼疫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烫堤。三九已至荣赶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸽斟,已是汗流浹背拔创。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留富蓄,地道東北人剩燥。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像立倍,于是被迫代替她去往敵國和親灭红。 傳聞我的和親對象是個殘疾皇子氛改,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容