GCD是蘋果公司爲多核的並行運算提出的解決方案程序員
GCD會自動利用更多的CPU內核(好比雙核、四核)併發
GCD會自動管理線程的生命週期(建立線程、調度任務、銷燬線程)app
GCD中有2個核心概念異步
(1)任務:執行什麼操做async
GCD的使用就2個步驟函數
(1)定製任務測試
將任務添加到隊列中,GCD會自動將隊列中的任務取出,放到對應的線程中執行spa
3、執行任務線程
1.GCD中有2個用來執行任務的函數code
說明:把右邊的參數(任務)提交給左邊的參數(隊列)進行執行。
(1)用同步的方式執行任務 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
參數說明:
queue:隊列
(2)用異步的方式執行任務 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
2.同步和異步的區別
同步:在當前線程中執行
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)串行同步
主隊列及其餘一些方法(這裏就不實現代碼了):
// // 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