IOS GCD 淺析

 1、簡單介紹
1.隊列的類型:
     1.1主隊列:main queue 主線程隊列,更新UI的操做。是一個串行的隊列,串行隊列每次只處理一個任務。
     1.2系統建立的併發隊列:global queue(全局的 並行的隊列),按照優先級分類。線程池提供多個線程來執行任務,因此按照FIFO的順序併發啓動、執行多個併發任務。
     1.3自定義的隊列:能夠根據須要建立串行隊列或併發的隊列。
2.任務:
     2.1封裝形式:block或C語言的的函數
     2.2添加到隊列的方式:同步或異步(只對併發隊列有區別)。無論是同步仍是異步,若是將任務加到串行隊列中都是一個接一個的執行,只有在併發隊列中才有區別。
3.特殊使用
     3.1僅執行一次            dispatch_once
     3.2延時執行               dispatch_after
     3.3成組的執行任務      dispatch_group
4.GCD的優點

GCD是蘋果公司爲多核的並行運算提出的解決方案程序員

GCD會自動利用更多的CPU內核(好比雙核、四核)併發

GCD會自動管理線程的生命週期(建立線程、調度任務、銷燬線程)app

程序員只須要告訴GCD想要執行什麼任務,不須要編寫任何線程管理代碼
 2、任務和隊列

GCD中有2個核心概念異步

(1)任務:執行什麼操做async

(2)隊列:用來存聽任務  

GCD的使用就2個步驟函數

(1)定製任務測試

(2)肯定想作的事情
 

將任務添加到隊列中,GCD會自動將隊列中的任務取出,放到對應的線程中執行spa

提示:任務的取出遵循隊列的FIFO原則:先進先出,後進後出
 

3、執行任務線程

1.GCD中有2個用來執行任務的函數code

說明:把右邊的參數(任務)提交給左邊的參數(隊列)進行執行。

(1)用同步的方式執行任務 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

參數說明:

queue:隊列

block:任務  

(2)用異步的方式執行任務 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

2.同步和異步的區別

同步:在當前線程中執行

異步:在另外一條線程中執行
 4、隊列

1.隊列的類型

GCD的隊列能夠分爲2大類型

(1)併發隊列(Concurrent Dispatch Queue)

可讓多個任務併發(同時)執行(自動開啓多個線程同時執行任務)併發功能只有在異步(dispatch_async)函數下才有效

(2)串行隊列(Serial Dispatch Queue)

讓任務一個接着一個地執行(一個任務執行完畢後,再執行下一個任務)

2.補充說明

有4個術語比較容易混淆:同步、異步、併發、串行

同步和異步決定了要不要開啓新的線程

同步:在當前線程中執行任務,不具有開啓新線程的能力

異步:在新的線程中執行任務,具有開啓新線程的能力

併發和串行決定了任務的執行方式

併發:多個任務併發(同時)執行

串行:一個任務執行完畢後,再執行下一個任務
----------分割------------
下面實現自定義隊列代碼(串行,並行,同步,異步):
//
// ViewController.m // CX-GCD //
// Created by ma c on 16/3/15. // Copyright © 2016年 xubaoaichiyu. All rights reserved. // 
#import "ViewController.h"

@interface ViewController () @end

@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //自定義隊列
 [self queueOne]; [self queueTwo]; [self queueThree]; [self queueFour]; } -(void)queueOne{ //串行同步 - 按順序執行 當即執行 不開闢新線程 //*注意* "xubaoaichiyu" 前不要加"@" 由於要求傳入char
    dispatch_queue_t queueOne = dispatch_queue_create("xubaoaichiyu", DISPATCH_QUEUE_SERIAL);//定義爲串行隊列 //同步
    NSLog(@"開始"); dispatch_sync(queueOne, ^{ NSLog(@"One->%@",[NSThread currentThread]); }); dispatch_sync(queueOne, ^{ NSLog(@"Two->%@",[NSThread currentThread]); }); NSLog(@"結束"); } -(void)queueTwo{ //串行異步 - 按順序實行 不當即之執行 開闢新線程
    dispatch_queue_t queueTwo = dispatch_queue_create("xubaoaichiyu", DISPATCH_QUEUE_SERIAL); //異步
    NSLog(@"開始"); dispatch_async(queueTwo, ^{ NSLog(@"One->%@",[NSThread currentThread]); }); dispatch_async(queueTwo, ^{ NSLog(@"Two->%@",[NSThread currentThread]); }); dispatch_async(queueTwo, ^{ NSLog(@"Three->%@",[NSThread currentThread]); }); NSLog(@"結束"); } -(void)queueThree{ //並行同步 - 不安順序執行 當即執行 不開闢新線程
    dispatch_queue_t queueThree = dispatch_queue_create("xubaoaichiyu", DISPATCH_QUEUE_CONCURRENT);//定義爲串行隊列 //同步
    NSLog(@"開始"); dispatch_sync(queueThree, ^{ NSLog(@"One->%@",[NSThread currentThread]); }); dispatch_sync(queueThree, ^{ NSLog(@"Two->%@",[NSThread currentThread]); }); NSLog(@"結束"); } -(void)queueFour{ //並行異步 - 不按順序執行 不當即執行 開闢新空間
    dispatch_queue_t queueFour = dispatch_queue_create("xubaoaichiyu", DISPATCH_QUEUE_CONCURRENT); //異步
    NSLog(@"開始"); dispatch_async(queueFour, ^{ NSLog(@"One->%@",[NSThread currentThread]); }); dispatch_async(queueFour, ^{ NSLog(@"Two->%@",[NSThread currentThread]); }); dispatch_async(queueFour, ^{ NSLog(@"Three->%@",[NSThread currentThread]); }); NSLog(@"結束"); } @end

分組測試結果:

1)串行同步

2)串行異步
 
3)並行同步
4)並行異步
 

主隊列及其餘一些方法(這裏就不實現代碼了):

//
//  ViewController.m
//  CX-GCD Two
//
//  Created by ma c on 16/3/15.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //主隊列 串行隊列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    //延遲
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC);
    dispatch_after(time, mainQueue, ^{
        NSLog(@"我來晚了兩秒");
    });
//    dispatch_barrier_async -> 在前面的任務執行結束後它才執行,並且它後面的任務等它執行完成以後纔會執行.
    //異步 按順序 不當即執行
    dispatch_async(mainQueue, ^{
        NSLog(@"a-One");
    //CGD中的單例
        [self onceToken];
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"a-Two");
        [self onceToken];
    });
    dispatch_barrier_async(mainQueue, ^{
        NSLog(@"--------分割--------");
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"a-Three");
        [self onceToken];
    });
    //同步 死鎖
//    NSLog(@"開始");
//    dispatch_sync(mainQueue, ^{
//        NSLog(@"One");
//    });
//    dispatch_sync(mainQueue, ^{
//        NSLog(@"Two");
//    });
//    dispatch_sync(mainQueue, ^{
//        NSLog(@"Three");
//    });
//    NSLog(@"結束");
//    執行某個代碼dispatch_apply(遍歷)
    dispatch_queue_t queue = dispatch_queue_create("xubaoaichiyu", DISPATCH_QUEUE_SERIAL);
    dispatch_apply(5, queue, ^(size_t i) {
        
        NSLog(@"%@",@(i));
        
    });
    
}

-(void)onceToken{
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"onceToken");
    });
    
}

@end

全局隊列及調度組:

//
//  ViewController.m
//  CX - GCD Three
//
//  Created by ma c on 16/3/15.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //全局隊列
    /*
     優先級
     DISPATCH_QUEUE_PRIORITY_HIGH
     DISPATCH_QUEUE_PRIORITY_DEFAULT
     DISPATCH_QUEUE_PRIORITY_LOW
     DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
     */
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    //調度組
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
       
        [NSThread sleepForTimeInterval:3];
        NSLog(@"Ome");
        
    });
    dispatch_group_async(group, queue, ^{
        
        [NSThread sleepForTimeInterval:2];
        NSLog(@"Two");
        
    });
    //dispatch_group_notify  只有當組內隊列結束後才執行
    dispatch_group_notify(group, queue, ^{
       
        NSLog(@"Three");
        
    });
    

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];


}

@end
相關文章
相關標籤/搜索