iOS开发--多线程编程(四)GCD(Grand Central Dispatch)

GCD (Grand Central Dispatch)

 GCD 底层也是用线程来实现,指示苹果帮咱们封装了具体操作的方法,这样可以让程序员不用关注实现的细节,只需要专注功能的实现

 GCD参数 queue:队列  block:任务

 GCD 有两种执行任务的方式 1.同步 dispatch_sync(避免在主队列中使用同步执行主线程任务  容易死锁) 2,异步 dispatch_async

 同步和异步的区别:

  同步:在当前线程中执行

  异步:在另一条线程中去执行

 

 GCD执行多个任务的队列方式 也有两种:

 1,串行队列:让任务一个接一个地执行(一个任务执行完再执行下一个任务)

 2,并发队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效

 

 串行队列又分成两种:

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

 2,创建一个队列:dispatch_queue_create


死锁:在主队列(GCD)里面,在主线程(UI线程)同步执行任务  就会造成死锁

主队列 主线程是一个东西

同步执行:一个任务执行完毕之后 才会去执行另一个任务

    

主队列(GCD)同步执行某个任务的时候会等待前面的任务执行完毕之后再执行主队列里面的任务

但是 主队列 是在主线程里面执行任务的 《他们两个现在在同一个线程里面》,然而线程是顺序执行的,这时候主线程会等主队列里面的任务执行完毕之后再去继续执行, 主队列会等待主线程执行完毕 才会去执行主队列里面的任务


同步执行

//    通过 GCD 获得 主队列
//    所有接受队列对象 都用 dispatch_queue_t
    dispatch_queue_t mainqueue = dispatch_get_main_queue();
   
    NSLog(@"主线程执行到这里等待主队列执行 ");
    
#pragma  mark  --------同步执行任务---------
   
    dispatch_sync(mainqueue, ^{
        NSLog(@"主队列 等待 主线程执行完毕之后 再执行");
    });
    
    NSLog(@"........");
输出结果:同步执行时,主队列一直在等待主线程执行完毕,但是主队列现在并不知道主线程和他现在处于同一个地方,所以他的等待没有尽头,永远等不到那个主线程

2016-04-27 16:20:29.192 多线程三GCD[4011:396363] 主线程执行到这里等待主队列执行 





异步执行

#pragma  mark -------异步执行任务-----------
    //    通过 GCD 获得 主队列
    //    所有接受队列对象 都用 dispatch_queue_t
    dispatch_queue_t mainqueue = dispatch_get_main_queue();
//    异步运行开辟一个线程,但是同步不运行开辟线程 (同步顺序执行,异步利用系统空闲时间去执行 ,程序员不能控制)
    NSLog(@"主线程执行到这里 发现一个异步执行的代码 会执行异步执行的代码,但是没有等待里面的任务执行完毕之后再去继续执行主线程任务43333333");
    dispatch_async(mainqueue, ^{
        NSLog(@"小主没有等我执行完毕 ");
        NSLog(@"更新UI  %@",[NSThread currentThread]);
    });
    
     NSLog(@"没有等小异 可以继续走");

输出结果:

2016-04-27 16:49:47.019 多线程三GCD[4311:416832] 主线程执行到这里 发现一个异步执行的代码 会执行异步执行的代码,但是没有等待里面的任务执行完毕之后再去继续执行主线程任务43333333
2016-04-27 16:49:47.019 多线程三GCD[4311:416832] 没有等小异 可以继续走
2016-04-27 16:49:47.022 多线程三GCD[4311:416832] 小主没有等我执行完毕 
2016-04-27 16:49:47.023 多线程三GCD[4311:416832] 更新UI  <NSThread: 0x7f94f1408c40>{number = 1, name = main}




串行队列

  串行队列 有两种方式

   1,主队列

   2,创建队列

 串行队列 是按照顺序 执行的


//  dispatch_get_main_queue() 属于串行队列
//    dispatch_queue_create("", NULL) 串行队列
//    串行队列:按照顺序去执行队列
    
    dispatch_queue_t mainQueue1 = dispatch_get_main_queue();
    dispatch_async(mainQueue1, ^{
        NSLog(@"111111");
    });
    dispatch_async(mainQueue1, ^{
        NSLog(@"222222");
    });
    dispatch_async(mainQueue1, ^{
        NSLog(@"333333");
    });
    dispatch_async(mainQueue1, ^{
        NSLog(@"444444");
    });

输出结果:顺序输出

2016-04-27 16:48:28.682 多线程三GCD[4245:414616] 111111
2016-04-27 16:48:28.683 多线程三GCD[4245:414616] 222222
2016-04-27 16:48:28.683 多线程三GCD[4245:414616] 33333
2016-04-27 16:48:28.683 多线程三GCD[4245:414616] 444444


创建队列

#pragma mark ---------创建队列<串行队列>------------
    
    dispatch_queue_t xiaoxiao =  dispatch_queue_create("晓晓", NULL);
    dispatch_sync(xiaoxiao, ^{
        NSLog(@"1111111");
    });
    dispatch_sync(xiaoxiao, ^{
        NSLog(@"2222222");
    });
    dispatch_sync(xiaoxiao, ^{
        NSLog(@"3333333");
    });
输出结果,同样是按顺序的



并发队列

可以设置队列任务的优先级

使用全局并发队列

//    GCD 默认已经提供了全局的并发队列  供整个应用使用,不需要手动创建
//    <#long identifier#> 指定优先级
    dispatch_queue_t firstqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
    dispatch_queue_t twoqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_queue_t threequeue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(firstqueue, ^{
        NSLog(@"1111111");
    });
    dispatch_async(twoqueue, ^{
        NSLog(@"22222");
    });
    dispatch_async(threequeue, ^{
        NSLog(@"333333");
    });
输出结果:这里设置了 twoqueue最高优先级,treequeue低优先级,first queue 为默认优先级

2016-04-27 16:57:15.449 多线程三GCD[4582:425634] 22222
2016-04-27 16:57:15.449 多线程三GCD[4582:425633] 333333
2016-04-27 16:57:15.449 多线程三GCD[4582:425635] 1111111




分组
//    dispatch_group_create() 创建一个分组
    
//    dispatch_group_t 就相当于 类名
    dispatch_group_t num1 = dispatch_group_create();
    dispatch_queue_t queue1 = dispatch_queue_create("num1",NULL);
//    <#dispatch_group_t group#> 组名
//    <#dispatch_queue_t queue#> 线程名
    dispatch_group_async(num1, queue1, ^{
        NSLog(@"download1.......");
    });

    dispatch_group_async(num1, queue1, ^{
        NSLog(@"download2.......");
    });
    
//   分组执行完毕
    dispatch_group_notify(num1, queue1, ^{
        NSLog(@"执行完毕1");
    });
    
    
    dispatch_group_t num2 = dispatch_group_create();
    int nums=5 ;
    for (int i = 0; i <nums; i ++) {
        dispatch_group_async(num2, queue1, ^{
            NSLog(@"dowee=======");
        });
    }
    
//    分组二
    dispatch_group_async(num2, queue1, ^{
        NSLog(@"2download1.......");
    });
    
    dispatch_group_async(num2, queue1, ^{
        NSLog(@"2download2.......");
    });
    
    //   分组执行完毕
    dispatch_group_notify(num2, queue1, ^{
        NSLog(@"执行完毕2");
    });
输出结果:

2016-04-27 17:05:48.254 多线程三GCD[4786:433080] download1.......
2016-04-27 17:05:48.255 多线程三GCD[4786:433080] download2.......
2016-04-27 17:05:48.255 多线程三GCD[4786:433080] dowee=======
2016-04-27 17:05:48.255 多线程三GCD[4786:433080] dowee=======
2016-04-27 17:05:48.255 多线程三GCD[4786:433080] dowee=======
2016-04-27 17:05:48.255 多线程三GCD[4786:433080] dowee=======
2016-04-27 17:05:48.256 多线程三GCD[4786:433080] dowee=======
2016-04-27 17:05:48.256 多线程三GCD[4786:433080] 2download1.......
2016-04-27 17:05:48.256 多线程三GCD[4786:433080] 2download2.......
2016-04-27 17:05:48.256 多线程三GCD[4786:433080] 执行完毕1
2016-04-27 17:05:48.256 多线程三GCD[4786:433080] 执行完毕2




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值