码迷,mamicode.com
首页 > 其他好文 > 详细

关于GCD的常用方法介绍,MRC

时间:2015-10-07 22:55:23      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:

1.GCD的简单介绍

GCD全称Great Center Dispatch,我们可以给它起个‘滚床单’名字,便于更好的记忆

GCD是由苹果公司开发的技术。是为了优化应用程序,支持多核心处理器和其他的对称多处理系统的系统

GCD属于函数级的多线程,运用的是C语言(大部分接触的是block块),性能更高,功能也更加强大。

GCD首次发布在Mac OS X10.6,iOS4及以上也可以用。

 

2.CGD的2个核心

1)任务:具有一定功能的代码段。

主要分为同步任务和异步任务

同步任务:不管在哪种类型的队列中,都只会在当前线程中执行任务,不具备开启新的线程的能力,并且都是串行执行任务。

异步任务:如果是在自己创建的串行队列,则是在子线程中完成,串行执行任务。

     如果是系统创建好的串行队列,则在主线程中完成,串行执行任务。

       如果是创建的并发队列,在开启多个线程,并发执行任务。

2)队列:GCD以队列的方式进行工作。

主要分为串行队列和并行队列,其中有分为手动创建和系统提供的队列。

串行队列 (SerialQueue):一次只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然他们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。SerialQueue能实现线程的同步。

并发队列 (ConcurrentQueue):可以并发的执行多个任务。但是遵循FIFO先进先出。

 

3.GCD的几个主要枚举参数

1)全局并发队列的优先级

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

2)队列的类型属性


//串行队列
DISPATCH_QUEUE_SERIAL //并发队列 DISPATCH_QUEUE_CONCURRENT

 

4.GCD的主要应用

将各个应用写入一个button的方法中,点击button然后触发对应的方法

1)串行队列

//串行队列
- (IBAction)handleSerialQueue:(id)sender {
    //1.获取串行队列
    //1)使用系统提供的串行队列(即主线程队列),往内部添加的任务都是添加到主线程上的,主要用于主线程与子线程之间的切换。
    //这里提醒一下:dispatch_sync方法不能在主队列中调用,因为这会无限期的阻止线程并会导致你的应用死锁。所有通过GCD提交到主队列的任务必须是异步的。
    //dispatch_queue_t queue1 = dispatch_get_main_queue();
    
    //2)自己创建的串行队列(即创建一个子线程队列),往内部添加的任务都是在自己创建的子线程中完成的
    //参数1:队列的唯一标示(和工程的唯一标识命名规则一样)   参数2:队列的属性类型(枚举即:是串行队列还是并发队列)
    dispatch_queue_t queue2 = dispatch_queue_create("com.i.cnblogs.dubuladuo",DISPATCH_QUEUE_SERIAL);
    //2.往队列中添加任务
    //1)添加同步任务
    dispatch_sync(queue2, ^{
        NSLog(@"任务1%@",[NSThread currentThread]);
    });
    dispatch_sync(queue2, ^{
        NSLog(@"任务2%@",[NSThread currentThread]);
    });
    //2)添加异步任务
    dispatch_async(queue2, ^{
        NSLog(@"任务1%@",[NSThread currentThread]);
    });
    dispatch_async(queue2, ^{
        NSLog(@"任务2%@",[NSThread currentThread]);
    });
    
    //对于有create字眼的对象需要进行release
    dispatch_release(queue2);
}

 

2)并发队列

//并发队列
- (IBAction)handleConcurrentQueun:(id)sender {
    //获取并发队列
    //1)使用系统创建好的。全局队列
    //参数1:队列的优先级    参数2:预留参数,主要为功能扩展
    dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2)自己创建的并发队列
    dispatch_queue_t queue2 = dispatch_queue_create("com.i.cnblogs.dubuladuo", DISPATCH_QUEUE_CONCURRENT);
    //2.往队列中添加任务
    //1)添加同步任务
    dispatch_sync(queue1, ^{
        NSLog(@"任务1%@",[NSThread currentThread]);
    });
    dispatch_sync(queue1, ^{
        NSLog(@"任务2%@",[NSThread currentThread]);
    });
    //2)添加异步任务
    dispatch_async(queue2, ^{
        NSLog(@"任务1%@",[NSThread currentThread]);
    });
    dispatch_async(queue2, ^{
        NSLog(@"任务2%@",[NSThread currentThread]);
    });
    
    //对于有create字眼的对象需要进行release
    dispatch_release(queue2);
    
}

 

3)分组

//分组
- (IBAction)handleGroup:(id)sender {
    //1.创建并发队列
    dispatch_queue_t queue = dispatch_queue_create("com.i.cnblogs.dubuladuo", DISPATCH_QUEUE_CONCURRENT);
    //2.创建分组
    dispatch_group_t group = dispatch_group_create();
    //3.向队列中添加任务,添加的为异步任务
    //参数1:执行的分组 参数2:执行的队列
    dispatch_group_async(group, queue, ^{
        NSLog(@"第一部分");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"第二部分");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"第三部分");
    });
    //4.在分组的任务完成之后进行拼接 此方法在组中的各项任务完成后触发
    dispatch_group_notify(group, queue, ^{
        NSLog(@"拼接数据");
    });
    //5.释放所有权
    dispatch_release(queue);
    dispatch_release(group);
}

 

4)执行一次

//只执行一次,类似单例
- (IBAction)handleOnce:(id)sender {
    //1.创建一个对象
    static dispatch_once_t onceToken;
    //参数:传的是dispatch_once_t的一个确切的地址,以此来判断,使得此方法只执行一次
    dispatch_once(&onceToken, ^{
        NSLog(@"11");
    });
}

 

5)重复

//重复(类似于for循环,只不过不是按照顺序进行的)
- (IBAction)handleApply:(id)sender {
    //1.创建并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.添加重复执行的任务
    //参数1:执行的次数 参数2:执行的队列   参数3:当前执行到第几次
    dispatch_apply(5, queue, ^(size_t index) {
        NSLog(@"%ld",index);
    });
}

 

6)障碍

//障碍:作用就是分割同一队列中的线程的执行顺序,比如:如果没有障碍,下面的写入文件和读取文件的顺序是随机的,而加入障碍,则先执行完障碍前的线程,然后才会执行障碍后的线程。
- (IBAction)handleBarrier:(id)sender {
    //1.创建并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.添加异步任务
    dispatch_async(queue, ^{
        NSLog(@"写入文件");
    });
    //3.添加障碍
    dispatch_barrier_async(queue, ^{
        NSLog(@"障碍物");
    });
    //4.再次添加异步任务
    dispatch_async(queue, ^{
        NSLog(@"读取文件");
    });
}

 

7)延时

//延时
- (IBAction)handleDelay:(id)sender {
    //1.创建并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.创建延时
    //参数1:开始的时间:现在   参数2:延续的时间
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
    //3.添加任务
    dispatch_after(time, queue, ^{
        NSLog(@"延时执行");
    });
}

 

 

关于GCD的常用方法介绍,MRC

标签:

原文地址:http://www.cnblogs.com/dubuladuo/p/4859697.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!