GCD的基本使用(二)

一.線程間通信

從子線程回到主線程
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 執(zhí)行耗時(shí)的異步操作...
      dispatch_async(dispatch_get_main_queue(), ^{
        // 回到主線程击蹲,執(zhí)行UI刷新操作
        });
});
簡(jiǎn)單小demo:
   //1.開線程下載圖片
    //DISPATCH_QUEUE_PRIORITY_DEFAULT 0
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"%@----",[NSThread currentThread]);
        
        //1.1 確定url
        NSURL *url = [NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201308/24/20130824215734_ut8LZ.thumb.600_0.jpeg"];
        
        //1.2 下載二進(jìn)制數(shù)據(jù)到本地
        NSData *data = [NSData dataWithContentsOfURL:url];
        
        //1.3 轉(zhuǎn)換圖片
        UIImage *image = [UIImage imageWithData:data];
        
        //刷新UI
        dispatch_sync(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
            NSLog(@"%@--UI--",[NSThread currentThread]);
        });
        
    });

二.GCD常用函數(shù)


//延遲執(zhí)行
-(void)delay
{
    NSLog(@"---start----");
    //1
    //[self performSelector:@selector(task) withObject:nil afterDelay:2.0];
    
    //2.
    //[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(task) userInfo:nil repeats:NO];
    
    //3.
    /*
     第一個(gè)參數(shù):DISPATCH_TIME_NOW 從什么時(shí)候開始計(jì)時(shí)
     第二個(gè)參數(shù):延遲的時(shí)間 2.0表示2秒 GCD的時(shí)間是以納秒為單位
     第三個(gè)參數(shù):隊(duì)列 
        dispatch_get_main_queue()  主線程
        如何是其他隊(duì)列(并發(fā)|串行),那么block在子線程中調(diào)用
     */
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{
        
        NSLog(@"--GCD----%@",[NSThread currentThread]);
    });
}

//柵欄函數(shù)
//知識(shí)點(diǎn):barrier在使用的時(shí)候不能使用全局并發(fā)隊(duì)列
-(void)barrier
{
    //1.創(chuàng)建隊(duì)列
    dispatch_queue_t queue = dispatch_queue_create("com.download", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i<10; i++) {
            NSLog(@"download1---%zd--%@",i,[NSThread currentThread]);
        }
    });
    
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i<10; i++) {
            NSLog(@"download2---%zd--%@",i,[NSThread currentThread]);
        }
    });
    
    //1.在子線程中執(zhí)行
    //2.開始執(zhí)行之前確保前面的任務(wù)1和任務(wù)2都已經(jīng)執(zhí)行完畢
    //3.只有當(dāng)我執(zhí)行完畢之后才能繼續(xù)執(zhí)行后面的任務(wù)
    dispatch_barrier_async(queue, ^{
        NSLog(@"+++++++++++++%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i<10; i++) {
            NSLog(@"download3---%zd--%@",i,[NSThread currentThread]);
        }
    });
    
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i<10; i++) {
            NSLog(@"download4---%zd--%@",i,[NSThread currentThread]);
        }
    });
    
//    dispatch_release(queue);
}

//一次性代碼
/*
 1)整個(gè)應(yīng)用程序中只會(huì)執(zhí)行一次
 2)本身是線程安全的
 */
-(void)once
{
    NSLog(@"------%s",__func__);
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"--once---%@",[NSThread currentThread]);
    });
    
}

//快速迭代
-(void)apply
{
    //串行執(zhí)行
//    for (NSInteger i = 0; i<10; i++) {
//        NSLog(@"%zd---%@",i,[NSThread currentThread]);
//    }
    
    /*
     第一個(gè)參數(shù):迭代的次數(shù)
     第二個(gè)參數(shù):隊(duì)列      !!!!不能傳主隊(duì)列
     注意:主線程也會(huì)參與迭代的過程,里面的任務(wù)是并發(fā)執(zhí)行的
         
     */
    dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_SERIAL);
//    dispatch_get_global_queue(0, 0)
    
    dispatch_apply(10, queue, ^(size_t index) {
        NSLog(@"%zd---%@",index,[NSThread currentThread]);
    });
    
}

-(void)moveFile
{
    //1.確定文件路徑
    NSString *sourePath = @"/Users/xiaomage/Desktop/from";
    
    //2.確定文件應(yīng)該剪切到哪個(gè)目錄
    NSString *targetPath = @"/Users/xiaomage/Desktop/to";
    
    //3.得到所有的文件
    NSArray *subpaths = [[NSFileManager defaultManager] subpathsAtPath:sourePath];
   
    
    //4.執(zhí)行迭代.把所有的文件都剪切到指定的地方
    dispatch_apply(subpaths.count, dispatch_get_global_queue(0, 0), ^(size_t index) {
       
        NSString *fileName = subpaths[index];
        
        //4.1 拼接文件的全路徑
                 來源目錄根文件全路徑
        //stringByAppendingPathComponent  /  
        NSString *soureFullpath = [sourePath stringByAppendingPathComponent:fileName];
        
        //4.2 目的地
        NSString *targetFullpath = [targetPath stringByAppendingPathComponent:fileName];
       
        //4.3 執(zhí)行剪切操作
        [[NSFileManager defaultManager] moveItemAtPath:soureFullpath toPath:targetFullpath error:nil];
        
        NSLog(@"%@---%@--%@",soureFullpath,targetFullpath,[NSThread currentThread]);
    });
}

-(void)task
{
    NSLog(@"%s",__func__);
}
@end
隊(duì)列組
首先:分別異步執(zhí)行2個(gè)耗時(shí)的操作
其次:等2個(gè)異步操作都執(zhí)行完畢后纹安,再回到主線程執(zhí)行操作

如果想要快速高效地實(shí)現(xiàn)上述需求藕帜,可以考慮用隊(duì)列組
dispatch_group_t group =  dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 執(zhí)行1個(gè)耗時(shí)的異步操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 執(zhí)行1個(gè)耗時(shí)的異步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // 等前面的異步操作都執(zhí)行完畢后皮获,回到主線程...

});

還需補(bǔ)充.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖两疚,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異含滴,居然都是意外死亡诱渤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門谈况,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勺美,“玉大人递胧,你說我怎么就攤上這事∩娜祝” “怎么了缎脾?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)占卧。 經(jīng)常有香客問我遗菠,道長(zhǎng),這世上最難降的妖魔是什么华蜒? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任辙纬,我火速辦了婚禮,結(jié)果婚禮上叭喜,老公的妹妹穿的比我還像新娘贺拣。我一直安慰自己,他們只是感情好捂蕴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布纵柿。 她就那樣靜靜地躺著,像睡著了一般启绰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沟使,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天委可,我揣著相機(jī)與錄音,去河邊找鬼腊嗡。 笑死着倾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的燕少。 我是一名探鬼主播卡者,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼客们!你這毒婦竟也來了崇决?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤底挫,失蹤者是張志新(化名)和其女友劉穎恒傻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體建邓,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盈厘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了官边。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沸手。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡外遇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出契吉,到底是詐尸還是另有隱情跳仿,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布栅隐,位于F島的核電站塔嬉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏租悄。R本人自食惡果不足惜谨究,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泣棋。 院中可真熱鬧胶哲,春花似錦、人聲如沸潭辈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽把敢。三九已至寄摆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間修赞,已是汗流浹背婶恼。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柏副,地道東北人勾邦。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像割择,于是被迫代替她去往敵國(guó)和親眷篇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 一. 函數(shù)執(zhí)行任務(wù) GCD中有2個(gè)用來執(zhí)行任務(wù)的常用函數(shù)用同步的方式執(zhí)行任務(wù) GCD中還有個(gè)用來執(zhí)行任務(wù)的柵欄函數(shù)...
    沈正方閱讀 400評(píng)論 2 0
  • 今天和大家一起來討論一下GCD的基本使用荔泳,有疏忽的地方蕉饼,還望各位不吝賜教。 一换可、多線程簡(jiǎn)介 1椎椰、多線程相關(guān)的概念 ...
    聽海聽心閱讀 190評(píng)論 0 1
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,139評(píng)論 30 470
  • 寒星殘?jiān)律衔鞣濉:脡?mèng)卻頻驚沾鳄。畫堂側(cè)畔才見慨飘,未有訴衷情。 殘葉咽,影伶仃瓤的,映寒屏休弃。酉雞司曉,催繼春風(fēng)圈膏,又是新正塔猾。
    煙火里的詩和遠(yuǎn)方閱讀 214評(píng)論 0 1
  • 每天使用1%的時(shí)間,進(jìn)步1%稽坤,成為1%的人丈甸! 今天是什么日子:20170609 天氣:12~34° 清晨自省 和善...
    6班三期12組組長(zhǎng)孫榮亮閱讀 200評(píng)論 0 0