GCD

GCD (Grand Centeral Dispatch)
苹果自己开发的技术,优化多核处理器,函数级的,效率更高,功能更强大。
同步任务:不管添加到哪种队列中,都是一个个执行,都是在主线程完成。
 异步任务: 如果添加在自己创建的串行队列中,则在子线程完成。如果添加在系统创建好的串行队列中,则在主线程完成。
 
一,串行队列
  1.创建串行队列
   1.1 获取系统的串行队列
// dispatch_queue_t queue1 =dispatch_get_main_queue();
dispath_queue_t queue1 = dispath_queue_create( "com.lanou.44", DISPATCH_QUEUE_SERIAL);
    /*
      //2.往串行队列中添加任务 (异步任务)
    dispatch_async(queue1, ^{
       
        NSLog(@"任务1 - 线程 %@",[NSThread currentThread]);
         });
        dispatch_async(queue1, ^{
            NSLog(@"任务2 - 线程 %@",[NSThread currentThread]);
    });
    dispatch_async(queue1, ^{
        NSLog(@"任务3 - 线程 %@", [NSThread currentThread]);
    });
    */
//2.往串行队列中添加同步任务
    dispatch_sync(queue1, ^{
        NSLog(@"任务1");
    });
    dispatch_sync(queue1, ^{
        NSLog(@"任务2");
    });
//    dispatch_release(queue1);//MRC 环境下需要将自己创建的队列释放
 
 
 
二,并发队列
- (IBAction)handleCurrentQueue:(id)sender {
    //2.1 获取并行队列
      //2.1.1 使用系统创建好的 全局队列
       //参数1:队列的优先级 参数2:预留参数 0
//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
      //2.1.1 使用自己创建的全局队列
    dispatch_queue_t queue = dispatch_queue_create("com.lanou.ZZ",DISPATCH_QUEUE_CONCURRENT);
   
   
      //2.1.2 往并发队列中添加异步任务
    dispatch_async(queue, ^{
        NSLog(@"任务1,线程%@",[NSThread currentThread]);
           });
    dispatch_async(queue, ^{
        NSLog(@"任务2,线程 %@",[NSThread currentThread]);
    });
    NSLog(@"%@",[NSThread isMainThread] ? @"主线程":@"子线程");
//从子线程回到主线程
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"主线程执行刷新UI界面");
    });
}
 
三,分组队列
- (IBAction)handleGroupQueue:(id)sender {
    //1.创建并发队列 并发执行此任务
    dispatch_queue_t  queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.创建分组 (自己创建)
    dispatch_group_t group = dispatch_group_create();
    //3.往队列中添加同一分组的任务
    dispatch_group_async(group, queue, ^{
        NSLog(@"请求0 ~ 30M的数据,线程%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"请求 30 ~ 60M的数据,线程%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"请求 60 ~ 100M的数据,线程%@",[NSThread currentThread]);
    });
    //4.在分组中的任务全部执行完毕之后 会触发该方法
    dispatch_group_notify(group, queue, ^{
        NSLog(@"分组任务完成,开始拼接数据");
    });
   
 //   dispatch_release(group);//MRC环境下需要释放分组
}
四,障碍队列
- (IBAction)handleBarrierQueue:(id)sender {
    //1.获取并发队列 如果想加障碍 必须是自己创建的队列
    dispatch_queue_t queue = dispatch_queue_create("com.lanou.ZZ", DISPATCH_QUEUE_CONCURRENT);
    //2. 往并发队列中添加异步任务
    dispatch_async(queue, ^{
        NSLog(@"写入文件");
    });
   
    // 添加障碍 间隔写入和读取
    dispatch_barrier_async(queue, ^{
        NSLog(@"我是障碍任务,要读取文件");
    });
   
    dispatch_async(queue, ^{
        NSLog(@"读取文件");
    });
//    dispatch_release(queue);  //释放队列 (MRC环境下)
}
 
五,重复队列
- (IBAction)handleRepeatQueue:(id)sender {
    //1.获取并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.添加重复任务
     //参数1.重复的次数 参数2:队列 参数3:当前的次数
    dispatch_apply(2, queue, ^(size_t index) {
        NSLog(@"%ld",index);
    });
   
}
六,一次队列
- (IBAction)handleOnceQueue:(id)sender {
    //代码只执行一次
    static dispatch_once_t onceToKen;
    dispatch_once(&onceToKen, ^{
        NSLog(@"这里的代码只执行一次");
    });
}
七,延迟队列
- (IBAction)handleDelay:(id)sender {
    //1.获取队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.添加延迟任务
   
    dispatch_after(DISPATCH_TIME_FOREVER, queue, ^{
        NSLog(@"延迟任务");
    });
   
}
posted @ 2016-03-10 09:01  莫念莫忘  阅读(73)  评论(0编辑  收藏  举报