GCD

關于進程和線程:
進程:進程是指在系統(tǒng)中正在運行的一個應用程序
每個進程之間是獨立的.
線程:一個進程要想執(zhí)行任務,必須得有線程(每一個進程中至少要有一個線程),進程只幫你分配內(nèi)存.
線程是進程的基本執(zhí)行單元

注:多線程同時執(zhí)行,其實是CPU快速地在多線程之間調(diào)度,同一時間,CPU只能處理一條線程.

主線程:一個iOS程序運行后,默認會開啟一條線程,即”主線程”.或”UI線程”
主線程作用:顯示/刷新UI界面 處理UI事件
主線程使用注意:別將比較耗時的操作放到主線程中(下載)

線程同步:
1.實質(zhì):為了防止多個線程搶奪同一個資源造成的數(shù)據(jù)安全問題
2.實現(xiàn):給代碼加一個互斥鎖(同步鎖)
@synchronized(self){
// 被鎖住的代碼
}

關于GCD:
什么是GCD : 牛逼的中樞調(diào)度器,純C.
優(yōu)勢:GCD是蘋果公司為多核的并行運算提出的解決方案
GCD會自動利用更多的CPU內(nèi)核(雙核,四核)
GCD會自動管理線程的生命周期 (創(chuàng)建線程,調(diào)度任務,銷毀線程)
程序員只需告訴GCD想要執(zhí)行什任務,不需要編寫任何線程管理代碼

任務和隊列
任務:執(zhí)行什么操作
隊列:用來存放任務

使用就2步驟:
定制任務;
將任務添加到隊列中(任務取出遵循FIFO,先進先出 后進后出)

同步與異步
同步: 只能在當前線程中執(zhí)行任務,不具備開啟新線程的能力
異步:可以在新的線程中執(zhí)行任務,具備開啟新線程的能力

我們很多時候會混淆一些術語: 同步 異步 串行 并發(fā)
同步和異步主要影響:能不能開啟新的線程
并發(fā)和串行主要影響:任務的執(zhí)行方式
并發(fā):多個任務并發(fā)(同時)執(zhí)行
串行:一個任務執(zhí)行完畢后,再執(zhí)行下一個任務

// dispatch_sync : 同步猜丹,不具備開啟線程的能力
// dispatch_async : 異步模闲,具備開啟線程的能力

// 并發(fā)隊列 :多個任務可以同時執(zhí)行
// 串行隊列 :一個任務執(zhí)行完后,再執(zhí)行下一個任務

隊列:存放任務
全局并發(fā)隊列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

自己創(chuàng)建的串行隊列

dispatch_queue_t queue = dispatch_queue_create("cn.yj.queue", NULL);

主隊列

 dispatch_queue_t queue = dispatch_get_main_queue();

線程間的通信:

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 執(zhí)行耗時的異步操作
      
        dispatch_async(dispatch_get_main_queue(), ^{
             //回到主線程,執(zhí)行UI刷新操作
        });
    });
  • 延時執(zhí)行
 // 3秒后回到主線程執(zhí)行block中的代碼
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), queue, ^{
        NSLog(@"------task------%@", [NSThread currentThread]);
    });
    
    // 3秒后自動開啟新線程 執(zhí)行block中的代碼
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), queue, ^{
        NSLog(@"------task------%@", [NSThread currentThread]);
    });
  • 一次性執(zhí)行
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"----once");
       
    });
  • 組隊列
    如果我們想同時下載兩張圖片,再合并,可以利用組隊列
  // 1.隊列組
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 2.下載圖片1
    __block UIImage *image1 = nil;
    dispatch_group_async(group, queue, ^{
        NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];
        NSData *data1 = [NSData dataWithContentsOfURL:url1];
        image1 = [UIImage imageWithData:data1];
    });
    
    // 3.下載圖片2
    __block UIImage *image2 = nil;
    dispatch_group_async(group, queue, ^{
        NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];
        NSData *data2 = [NSData dataWithContentsOfURL:url2];
        image2 = [UIImage imageWithData:data2];
    });
    
    // 4.合并圖片 (保證執(zhí)行完組里面的所有任務之后鞭光,再執(zhí)行notify函數(shù)里面的block)
    dispatch_group_notify(group, queue, ^{
        // 開啟一個位圖上下文
        UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);
        
        // 繪制第1張圖片
        CGFloat image1W = image1.size.width;
        CGFloat image1H = image1.size.height;
        [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];
        
        // 繪制第2張圖片
        CGFloat image2W = image2.size.width * 0.5;
        CGFloat image2H = image2.size.height * 0.5;
        CGFloat image2Y = image1H - image2H;
        [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];
        
        // 得到上下文中的圖片
        UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();
        
        // 結(jié)束上下文
        UIGraphicsEndImageContext();
        
        // 5.回到主線程顯示圖片
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = fullImage;
        });
    });
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末噪窘,一起剝皮案震驚了整個濱河市笋庄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌效览,老刑警劉巖无切,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荡短,死亡現(xiàn)場離奇詭異丐枉,居然都是意外死亡,警方通過查閱死者的電腦和手機掘托,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門瘦锹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闪盔,你說我怎么就攤上這事弯院。” “怎么了泪掀?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵听绳,是天一觀的道長。 經(jīng)常有香客問我异赫,道長椅挣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任塔拳,我火速辦了婚禮鼠证,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靠抑。我一直安慰自己量九,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荠列,像睡著了一般类浪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弯予,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天戚宦,我揣著相機與錄音,去河邊找鬼锈嫩。 笑死受楼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的呼寸。 我是一名探鬼主播艳汽,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼对雪!你這毒婦竟也來了河狐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤瑟捣,失蹤者是張志新(化名)和其女友劉穎馋艺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迈套,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡捐祠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桑李。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踱蛀。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贵白,靈堂內(nèi)的尸體忽然破棺而出率拒,到底是詐尸還是另有隱情,我是刑警寧澤禁荒,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布猬膨,位于F島的核電站,受9級特大地震影響呛伴,放射性物質(zhì)發(fā)生泄漏勃痴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一磷蜀、第九天 我趴在偏房一處隱蔽的房頂上張望召耘。 院中可真熱鬧,春花似錦褐隆、人聲如沸污它。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衫贬。三九已至德澈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間固惯,已是汗流浹背梆造。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留葬毫,地道東北人镇辉。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像贴捡,于是被迫代替她去往敵國和親忽肛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

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