美文网首页
OC底层知识点之-多线程(二)GCD上篇

OC底层知识点之-多线程(二)GCD上篇

作者: iOS博仔 | 来源:发表于2022-09-26 16:18 被阅读0次

GCD简介(Grand Central Dispatch)

GCD是纯C语言,提供了非常多的强大函数
GCD是非常高效的多线程开发方式,它并不是Cocoa框架的一部分

GCD优势

1.GCD是苹果公司为多核的并行运算提出的解决方案
2.GCD会自动利用更多的CPU内核(比如双核、四核)
3.GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
4.开发者只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码【总结】:GCD就是将任务添加到队列,并且指定执行任务的函数。

GCD使用 (GCD的核心就是dispatch队列任务)

1.定义任务
2.将任务添加到队列中

GCD队列

1.主线程队列 (提交的任务将会在主线程完成)

  • 可以通过dispatch_get_main_queue获得
  • 主队列就是主线程,它是一个串行队列,在iOS中只有主线程才能拥有权限向渲染服务提交图层信息,完成图形显示工作。所以和UI相关操作,必须在主线程执行
    2.全局并发队列(Gobal queue) 全局并发队列由整个进程共享,有高,中(默认),低,后台四个优先级
    3.自定义队列
    · 并发队列
    - 全局队列是并发队列
    - 通过dispatch_queue_create创建,第二个参数是DISPATCH_QUEUE_CONCURRENT等
    - 不用等待上个任务是否完成,直接启用新的线程执行新的任务。
    · 串行队列:
    - 通过dispatch_queue_create创建,第二个参数赋值为DISPATCH_QUEUE_SERIAL或者NULL。
    - 串行队列在同一时间只能执行一个任务 整体如下图所示:


GCD任务

GCD任务就是操作的意思,就是在block块中的代码通过什么方式执行。执行任务有两种方式:同步和异步,两者主要区别是:是否等待队列的任务执行结束,以及是否具备开辟线程的能力。

同步执行(sync)

  • 1.同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。
  • 2.只能在当前线程中执行任务,不具备开启新线程的能力。

异步执行 (async)

  • 1.异步添加任务到指定的队列中,它不会做任何等待,可以继续执行任务。
  • 2.可以在新的线程中执行任务,具备开启新线程的能力。
    GCD的基本写法:
//还原基础写法
- (void)syncTest{
    dispatch_block_t block = ^{
        NSLog(@"hello GCD");
    };
    //串行队列
    dispatch_queue_t queue = dispatch_queue_create(@"com.hm.cn", NULL);
    //函数
    dispatch_async(queue, block);
}

下面再将队列和任务搭配执行看打印结果:

/**
同步并发
*/
- (void)concurrentSyncTest{
    dispatch_queue_t queue = dispatch_queue_create("HM", DISPATCH_QUEUE_CONCURRENT);
    for (int i = 0;  i < 10 ; i++){
        dispatch_sync(queue, ^{
            NSLog(@"同步并发-%d-%@", i , [NSThread currentThread]);
        });
    }
}

相关文章

网友评论

      本文标题:OC底层知识点之-多线程(二)GCD上篇

      本文链接:https://www.haomeiwen.com/subject/qzkwortx.html