四. GCD線程通信與常用函數(shù)

一. GCD實(shí)現(xiàn)線程之間的通信

  1. 需求:
    • 創(chuàng)建全局并發(fā)隊(duì)列, 并且使用異步函數(shù)開啟一條子線程來下載一張圖片

    • 當(dāng)圖片下載結(jié)束, 調(diào)用主線程的方法, 將圖片設(shè)置到ImageView中, 刷新UI

        - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
            
            // 1. 開啟線程下載圖片
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                
                // 2. 創(chuàng)建URL
                NSURL *url = [NSURL URLWithString:@"http://dimg06.c-ctrip.com/images/tg/161/023/909/de45d234ba8147a0ace4880a92c23994_C_640_640.jpg"];
                
                // 3. 下載二進(jìn)制到本地
                NSData *data = [NSData dataWithContentsOfURL:url];
                
                // 4. 將數(shù)據(jù)轉(zhuǎn)換為圖片
                UIImage *image = [UIImage imageWithData:data];
                NSLog(@"%@", [NSThread currentThread]);
                
                
                // 5. 回到主線程設(shè)置圖片(UI操作切記要在主線程中進(jìn)行, 否則會(huì)出現(xiàn)各種怪異問題)
                dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"%@", [NSThread currentThread]);
                    self.imageView.image = image;
                });
            });
        }
      

二. CGD的常用函數(shù)

  1. 延遲執(zhí)行任務(wù): Delay

    • 在開發(fā)中, 會(huì)出現(xiàn)讓一個(gè)方法延遲X秒之后再去執(zhí)行, 稱之為延遲執(zhí)行
    • 延遲執(zhí)行的各種方法:
      • 使用NSRunLoop的方法, 在當(dāng)前線程中, 推遲X秒, 執(zhí)行指定的方法
        [self performSelector:@selector(task) withObject:nil afterDelay:2];
      • 使用NSTimer的方法, 在當(dāng)前的運(yùn)行循環(huán)中添加一個(gè)NSTimter的實(shí)例, 當(dāng)X秒后, 執(zhí)行指定的方法
        [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(task) userInfo:nil repeats:NO];
      • 使用GCD定時(shí)器, 推遲X秒后執(zhí)行指定的任務(wù)
        • GCD延遲執(zhí)行, 在原理上是將Block的代碼先保存起來, 然后推遲指定的時(shí)間后, 執(zhí)行Block的代碼

        • GCD延遲執(zhí)行還可以設(shè)置隊(duì)列, 讓Block的代碼在指定的隊(duì)列中執(zhí)行

        • dispatch_after本身還是一個(gè)異步函數(shù), 因此他可以在指定隊(duì)列的情況下, 使用子線程去執(zhí)行任務(wù), 因此效率更好

            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{
                [self task];
                NSLog(@"%@", [NSThread currentThread]);
            });
          
  2. 一次性代碼(重要!多用于單例!!!)

    • 使用格式

        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            [self task];
        });
      
    • 注意點(diǎn):

      • 一次性代碼在整個(gè)程序中, 僅會(huì)執(zhí)行一次, 當(dāng)再次調(diào)用, dispatch_once函數(shù)中的內(nèi)容將不會(huì)再次執(zhí)行
      • 不能再懶加載中使用這個(gè)函數(shù)
      • 這個(gè)函數(shù)主要用于創(chuàng)建單例對象, 確保單例在整個(gè)程序中只分配一次內(nèi)存
  3. 柵欄函數(shù)

    • 柵欄函數(shù)用于控制任務(wù)的執(zhí)行順序

    • 在兩個(gè)任務(wù)之間, 增加?xùn)艡诤瘮?shù), 那么任務(wù)的執(zhí)行順序就會(huì)分隔開, 前面的任務(wù)執(zhí)行結(jié)束之后, 后面的任務(wù)才會(huì)執(zhí)行

    • 柵欄函數(shù)主要用于控制并發(fā)隊(duì)列中, 任務(wù)執(zhí)行的順序

    • 在串行隊(duì)列中沒有必要使用柵欄函數(shù), 因?yàn)榇嘘?duì)列本身就是按照順序串行執(zhí)行任務(wù)的

    • 注意: 柵欄函數(shù)不能用于全局并發(fā)隊(duì)列, 柵欄函數(shù)在全局并發(fā)并不會(huì)生效

        // 3. 柵欄函數(shù)
        - (void)barrier {
            
            // 1. 創(chuàng)建并發(fā)隊(duì)列
            dispatch_queue_t queue = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT);
            
            // 2. 異步函數(shù)創(chuàng)建任務(wù)
            dispatch_async(queue, ^{
                [self task];
            });
            
            dispatch_async(queue, ^{
                [self task];
            });
            
            // 3. 柵欄函數(shù)
            dispatch_barrier_async(queue, ^{
                NSLog(@"-----------------");
            });
            
            dispatch_async(queue, ^{
                [self task];
            });
            
            dispatch_async(queue, ^{
                [self task];
            });
            
            dispatch_async(queue, ^{
                [self task];
            });
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缭黔,一起剝皮案震驚了整個(gè)濱河市麦射,隨后出現(xiàn)的幾起案子博脑,更是在濱河造成了極大的恐慌笤闯,老刑警劉巖序愚,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茫船,居然都是意外死亡块茁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門辫狼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來初斑,“玉大人,你說我怎么就攤上這事膨处〖樱” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵真椿,是天一觀的道長鹃答。 經(jīng)常有香客問我,道長突硝,這世上最難降的妖魔是什么测摔? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上锋八,老公的妹妹穿的比我還像新娘浙于。我一直安慰自己,他們只是感情好挟纱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布羞酗。 她就那樣靜靜地躺著,像睡著了一般紊服。 火紅的嫁衣襯著肌膚如雪檀轨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天欺嗤,我揣著相機(jī)與錄音参萄,去河邊找鬼。 笑死煎饼,一個(gè)胖子當(dāng)著我的面吹牛讹挎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腺占,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼淤袜,長吁一口氣:“原來是場噩夢啊……” “哼痒谴!你這毒婦竟也來了衰伯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤积蔚,失蹤者是張志新(化名)和其女友劉穎意鲸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尽爆,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怎顾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漱贱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片槐雾。...
    茶點(diǎn)故事閱讀 38,629評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幅狮,靈堂內(nèi)的尸體忽然破棺而出募强,到底是詐尸還是另有隱情,我是刑警寧澤崇摄,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布擎值,位于F島的核電站,受9級(jí)特大地震影響逐抑,放射性物質(zhì)發(fā)生泄漏鸠儿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望进每。 院中可真熱鬧汹粤,春花似錦、人聲如沸品追。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肉瓦。三九已至遭京,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泞莉,已是汗流浹背哪雕。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲫趁,地道東北人斯嚎。 一個(gè)月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像挨厚,于是被迫代替她去往敵國和親堡僻。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評論 2 348

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