GCD的几种创建方式及基本使用

同步函数

  • 同步函数+主队列
 
    //获得主函数
    dispatch_queue_t queue = dispatch_get_main_queue();
    //2 将任务加入到队列中
    dispatch_sync(queue, ^{
        NSLog(@"1-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"2-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"3-----%@",[NSThread currentThread]);
    });


  //注意:同步函数+主队列:没有开启新线程,串行执行任务。如果在主线程中使用的话,就会造成阻塞,不会执行队列中的内容。因为同步函数和主队列在主线程中同时执行,造成了冲突。

  • 同步函数+串行队列




    //1 创建串行队列
    dispatch_queue_t queue = dispatch_queue_create("com.zc.queue", NULL);
    //2 将任务加入队列中
    dispatch_sync(queue, ^{
        NSLog(@"1-------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"2------%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"3------%@",[NSThread currentThread]);
    });

    //注意:同步函数+串行队列:不会开启新的线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务。
  • 同步函数+并发队列
    
    
    
  
    //1 获得全局的并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2 将任务加入到队列中
    dispatch_sync(queue, ^{
        
        NSLog(@"1--%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        
        NSLog(@"2---%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        
        NSLog(@"3---%@",[NSThread currentThread]);
    });
      //注意:同步函数+并发队列:不会开启新的线程,串行执行任务

异步函数

  • 异步函数+主队列

    
 
    //1 获得主队列
    dispatch_queue_t queue = dispatch_get_main_queue();
    //2 将任务加入到队列中
    dispatch_async(queue, ^{
        NSLog(@"1----%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2----%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"3-----%@",[NSThread currentThread]);
    });
    
   //注意:异步函数+主队列:只在主线程中执行任务,没有开启新线程,串行执行任务
  • 异步函数+串行队列


    //1 创建串行队列
    dispatch_queue_t queue = dispatch_queue_create("com.zc.queue", DISPATCH_QUEUE_SERIAL);
    //2 将任务加入到队列中
    dispatch_async(queue, ^{
        NSLog(@"1------%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"2-----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"3------%@",[NSThread currentThread]);
    });
    
    //注意:异步函数+串行队列:会开启新的线程,但是任务是串行的,执行完一个任务,再执行下一个任务
 
  • 异步函数+并发队列

   
    
  
    
    //1 创建一个并发队列
    //dispatch_queue_t queue = dispatch_queue_create("com.zc.queue", DISPATCH_QUEUE_CONCURRENT);
    //1 获得全局的并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2 将任务加入队列
    dispatch_async(queue, ^{
        for (int i=0; i<5; i++) {
            NSLog(@"1----%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i=0; i<5; i++) {
            NSLog(@"2----%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i=0; i<5; i++) {
            NSLog(@"3----%@",[NSThread currentThread]);
        }
    });
    
  //注意:异步函数+并发队列:可以同时开启多条新线程,并发执行任务

总结

GCD的几种的创建方式,只有异步函数+并发队列,既开新线程又并发执行任务;异步函数+串行队列:开新
线程但串行执行任务;其他的方式都是不开新线程(意思是在主线程中)并且串行执行任务。异步函数和
同步函数的执行方式不同。异步函数先执行函数体,再执行队列中的任务;同步函数是从头到尾从一步步
执行的,即从函数体头部开始执行,遇到队列,就执行队列中的任务。执行方式的不同,也就数异步函
数+主队列可以运行,而同步函数+主队列就会造成堵塞的原因。

你可能感兴趣的:(GCD的几种创建方式及基本使用)