iOS开发之GCD介绍

1.GCD全称Grand Central Dispatch,以为功能强大的中央调度器, 它是基于C语言的。如果使用GCD,完全由系统管理线程,我们不需要编写线程代码。只需定义想要执行的任务,然后添加到适当的 调度队列 ( dispatch queue )。GCD会负责创建线程和调度你的任务,系统直接提供线程管理。
2.GCD优势:GCD会自动充分利用CPU内核
                GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程 )
                开发人员不需要编写任何线程管理代码
3.GCD两个核心概念
                            任务:执行什么操作
                            队列:用来存放任务
4.GCD两个执行任务的函数 
        ① 用同步的方式执行任务  dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
参数说明:queue:队列 block:任务
        ② 用异步的方式执行任务  dispatch_async(dispatch_queue_t queue, dispatch_block_t block); 
5.串行队列
    GCD获得串行队列有两种方法使用dispatch_queue_create函数创建串行队列

               dispatch_queue_t  dispatch_queue_create(const char *label,  dispatch_queue_attr_t                 attr); // 队列名称, 队列属性,一般用NULL即可

示例:

dispatch_queue_t queue = dispatch_queue_create("队列名称", NULL); // 创建

(使用主队列(跟主线程相关联的队列)

主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行

使用dispatch_get_main_queue()获得主队列

示例:

dispatch_queue_t queue = dispatch_get_main_queue();      
6.并发队列
        使用dispatch_get_global_queue函数获得全局的并发队列
dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags); // 此参数暂时无用,用0即可

示例:

这个参数是留给以后用的,暂时用不上,传个0。

第一个参数为优先级,这里选择默认的。获取一个全局的默认优先级的并发队列。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 获得全局并发队列

              说明:全局并发队列的优先级

               #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 // 后台


6.使用示例

   (1)使用异步函数往并发队列中添加任务

    //1.获得全局的并发队列

    dispatch_queue_t queue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

     //2.添加任务到队列中,就可以执行任务

     //异步函数:具备开启新线程的能力

     dispatch_async(queue, ^{

         NSLog(@"下载图片1----%@",[NSThread currentThread]);

     });

     dispatch_async(queue, ^{

         NSLog(@"下载图片2----%@",[NSThread currentThread]);

     });

     dispatch_async(queue, ^{

         NSLog(@"下载图片2----%@",[NSThread currentThread]);

     });

 //打印主线程

     NSLog(@"主线程----%@",[NSThread mainThread]);


//用异步函数往串行队列中添加任务

//创建串行队列

     dispatch_queue_t  queue= dispatch_queue_create("duiliemingcheng", NULL);

     //第一个参数为串行队列的名称,是c语言的字符串

     //第二个参数为队列的属性,一般来说串行队列不需要赋值任何属性,所以通常传空值(NULL)

     

     //2.添加任务到队列中执行

     dispatch_async(queue, ^{

        NSLog(@"下载图片1----%@",[NSThread currentThread]);

     });

     dispatch_async(queue, ^{

         NSLog(@"下载图片2----%@",[NSThread currentThread]);

    });

     dispatch_async(queue, ^{

         NSLog(@"下载图片2----%@",[NSThread currentThread]);

 

     });


7.延迟执行

1.介绍

        iOS常见的延时执行有2种方式

             (1)调用NSObject的方法

                 [self performSelector:@selector(run) withObject:nil afterDelay:2.0];

                 // 2秒后再调用self的run方法

                 该方法在哪个线程调用,那么run就在哪个线程执行(当前线程),通常是主线程。

             (2)使用GCD函数

                   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)                     (2.0 NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    // 2秒后异步执行这里的代码...

 

});



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值