iOS Grand Central Dispatch (GCD) 的一般使用详解

iOS提供Grand Central Dispatch(GCD)来实现多线程。多线程的两个核心概念为:任务和队列。

队列:队列负责管理开发者提交的任务,GCD始终以FIFO(先进先出)的方式管理任务。

任务:用户提交给队列的工作单元。

1. Dispatch queue

执行任务的Dispatch queue有两种,分别为:顺序执行队列(Serial Dispatch Queue和 并发执行队列Concurrent Dispatch Queue)。

(1)创建队列

  <1> dispatch_get_main_queue();

//获取当前应用的主线程所关联的串行队列

获取主线程所关联的串行队列并执行任务的示例代码如下所示:

    dispatch_async(dispatch_get_main_queue(), ^{

        //        要执行的代码

        NSLog(@"dispatch_get_main_queue() %@",[NSThreadcurrentThread]);

    });


  <2> dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>);

//获取全局的并发队列 

第一个参数表示队列的优先级,分为五种。分别为:DISPATCH_QUEUE_PRIORITY_HIGH2 DISPATCH_QUEUE_PRIORITY_DEFAULT0 DISPATCH_QUEUE_PRIORITY_LOW (-2)和 DISPATCH_QUEUE_PRIORITY_BACKGROUND 。第二个参数暂未使用,一般传入0即可。

根据优先级等来获取全局队列并执行任务的示例代码如下所示:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT ,0 ), ^{

        //         要执行的代码

        NSLog(@"dispatch_get_global_queue %@",[NSThreadcurrentThread]);

    });


  <3> dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)

//根据指定字符串标签创建队列 第一个参数表示创建的队列的标签,第二个参数设置为“DISPATCH_QUEUE_CONCURRENT”表示创建的队列为并发执行队列,设置为“DISPATCH_QUEUE_SERIAL”表示创建的队列为顺序执行队列

创建并发执行队列并执行任务的示例代码如下所示:

 dispatch_queue_t queue =dispatch_queue_create("queueName.queue",DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue, ^{

        NSLog(@"dispatch_queue_create  %@",[NSThreadcurrentThread]);

    });


创建顺序执行队列并执行任务的示例代码如下所示


 dispatch_queue_t queue = dispatch_queue_create("queueName.queue", DISPATCH_QUEUE_SERIAL);

    dispatch_async(queue, ^{

        NSLog(@"dispatch_queue_create  %@",[NSThread currentThread]);

    });


(2)提交任务

 <1> void dispatch_async(dispatch_queue_t queue,dispatch_block_t block); 
//将任务以代码块的形式异步提交给指定队列。
使用示例如下:

  dispatch_async(dispatch_get_main_queue(), ^{

        //        要执行的代码

        NSLog(@"dispatch_get_main_queue() %@",[NSThread currentThread]);

    });


 <2>  void  dispatch_sync( dispatch_queue_t  queue,  dispatch_block_t  block);  //将任务以代码块的形式同步提交给指定队列。

 示例代码如下所示:

  

  dispatch_sync(dispatch_get_main_queue(), ^{

        //        要执行的代码

        NSLog(@"dispatch_get_main_queue() %@",[NSThread currentThread]);

    });


 <3>  void dispatch_apply( size_t iterations, dispatch_queue_t queue, void (^block)( size_t));
//将任务以代码块的形式提交给队列并重复执行  第一个参数传入要执行的次数,第二个参数传入要执行任务的队列 该方法属于不可控制的重复执行,类似于for循环

示例代码如下所示:

    dispatch_apply(10,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^(size_t index) {

        NSLog(@"1111111111111111");

    });


 <4> void dispatch_once(dispatch_once_t *predicate,dispatch_block_t block); 

//将任务以代码块的形式提交给队列,并保证在应用的生命周期中只执行一次。

示例代码如下所示:

-(void)TestDispatch_once

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        NSLog(@"  onceToken;   onceToken; ");

    });


 <5> void dispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block);

//将任务以代码块的形式提交给队列,并设置该任务延时执行

示例代码如下所示:

-(void)TestDispatch_after

{

    double delayInSeconds = 2.0;

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds *NSEC_PER_SEC);

    dispatch_after(popTime,dispatch_get_main_queue(), ^(void){

        NSLog(@"after ;  after;");

    });

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值