iOS開發(fā)之GCD

先直接上常用功能代碼:

1.延時函數

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 這里要特別注意:第二個參數單位是納秒,就是說,延時1秒的話,應該是“1000000000”
        // to do:
    });
// 系統(tǒng)定義的宏
#define NSEC_PER_SEC 1000000000ull   //每秒有多少納秒
#define NSEC_PER_MSEC 1000000ull
#define USEC_PER_SEC 1000000ull
#define NSEC_PER_USEC 1000ull

2.異步操作

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
       // to do
       // 異步操作,一般為比較耗時的操作
        dispatch_async(dispatch_get_main_queue(), ^{
                // to do
                // 更新界面
            
        });
    });

3.一組線程執(zhí)行完畢之后執(zhí)行(無序)

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, queue, ^{
        // to do
        // 第一組
    });
    dispatch_group_async(group, queue, ^{
        // to do
        // 第二組
    });
    dispatch_group_async(group, queue, ^{
       // to do
       // 第三組
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // to do 
        // 三個任務都執(zhí)行完畢后執(zhí)行
    });

4.執(zhí)行某段代碼n次

 dispatch_apply(5, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
       // to do
    });

5.timer

#import "ViewController.h"

@interface ViewController ()
{
    dispatch_source_t _timer;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 獲取一個隊列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 創(chuàng)建一個timer放到隊列里
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    // 設置timer首次執(zhí)行的時間,間隔,精確度
    dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0);
    // 設置timer執(zhí)行的事件
    __weak typeof(self) SELF = self;
    dispatch_source_set_event_handler(_timer, ^{
        [SELF log];
    });
    // 激活timer
    dispatch_resume(_timer);
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    // 取消timer
    dispatch_source_cancel(_timer);
}

- (void)log {
    NSLog(@"123");
}

6.單例模式

 + (Class*)instance {
    static Class *class = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        class = [[self alloc] init];
    });
    return class;
  }

CGD(Grand Central Dispatch,大中樞派發(fā))

GCD是蘋果開發(fā)的一個多核編程的解決方法,還有兩種NSThread,NSOperarion;
GCD是蘋果推薦而且最簡潔的;
純C語言,提供了非常多強大的函數;
GCD會自動利用更多的CPU內核(比如雙核、四核);
GCD會自動管理線程的生命周期(創(chuàng)建線程、調度任務、銷毀線程);
只需要告訴GCD想要執(zhí)行什么任務,不需要編寫任何線程管理代碼


GCD中的函數大多數都以dispatch開頭

在理解GCD之前,請先理解進程,線程,同步、異步執(zhí)行,并行、串行隊列

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

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

GCD的2個核心概念:

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

將任務添加到隊列中,GCD會自動將隊列中的任務取出,放到對應的線程中執(zhí)行,任務的取出遵循隊列的FIFO原則

GCD的隊列可以分為2大類型

  1. 并發(fā)隊列(Concurrent Dispatch Queue)
    可以讓多個任務并發(fā)執(zhí)行,并發(fā)功能只有在異步(dispatch_async)函數下才有效

  2. 串行隊列(Serial Dispatch Queue)
    讓任務一個接著一個地執(zhí)行


使用dispatch_get_main_queue()獲得主隊列,主隊列是GCD自帶的一種特殊的串行隊列,放在主隊列中的任務,都會放到主線程中執(zhí)行

注意:

iOS 所有的UI操作都必須在主線程上執(zhí)行


GCD提供了全局的并發(fā)隊列,不需要手動創(chuàng)建

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

第一個參數為優(yōu)先級,第二個參數文檔上說以后會用到,目前都傳0即可

全局并發(fā)隊列的優(yōu)先級如下

#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默認(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
// 后臺

希望會給大家?guī)韼椭鶲(∩_∩)O

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容