首页投稿(暂停使用,暂停投稿)iOS 开发

GCD的使用简单总结

2016-07-27  本文已影响45人  浮桥小麦

GCD的知识技能点截图:

Snip20160727_1.png
知识点逐一简介
NO.1 GCD同步函数+串行队列(所有的都写为一个小方法,调用就好)
-(void)syncSerial
{
  //1.创建串行队列  
#"45":队列标签可以随便命名,但最好还是和自己要执行的任务有关(见名知意)
#DISPATCH_QUEUE_SERIAL:表示为串行队列的宏
 dispatch_queue_t queue = dispatch_queue_create("45", DISPATCH_QUEUE_SERIAL);
 //2.封装任务(其实就是把自己要执行的任务放入创建好的队列中)
 #  dispatch_sync:为同步函数,不具备开线程能力     
 dispatch_sync(queue, ^{
        //打印一句话和当前线程()
        NSLog(@"演员1-----%@",[NSThread currentThread]);
   });
    dispatch_sync(queue, ^{
       NSLog(@"演员2-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
       NSLog(@"演员3-----%@",[NSThread currentThread]);
    });
}
#注:这样执行的三个任务都在主线程中执行且是串行执行的(即依次进行)

NO.2 GCD同步函数+并行队列
-(void)syncConcurrent
{
//1.创建队列(这个队列是自己创建的)
#DISPATCH_QUEUE_CONCURRENT:并发队列的宏
    dispatch_queue_t  queue = dispatch_queue_create( "126", DISPATCH_QUEUE_CONCURRENT);

 //2.封装任务
    dispatch_sync(queue, ^{
        //打印一句话和当前线程
      NSLog(@"演员1-----%@",[NSThread currentThread]);
   });
    dispatch_sync(queue, ^{
    NSLog(@"演员2-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"演员3-----%@",[NSThread currentThread]);
   });

}
#注:不会开辟线程,在主线程中执行任务,任务是串行执行的
#获得系统的全局并发队列
 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
#DISPATCH_QUEUE_PRIORITY_DEFAULT:队列优先级的宏
NO.3 GCD异步函数+串行队列
-(void)asyncSerial
{
 //1.创建串行队列
    dispatch_queue_t queue = dispatch_queue_create("12345", DISPATCH_QUEUE_SERIAL);
 //2.封装任务(异步函数)
# dispatch_async:异步函数具备开线程的能力 
    dispatch_async(queue, ^{
   //打印一句话和当前线程(打印出来number = 2,是在子线程中执行的)
   NSLog(@"丑八怪啊-1-----%@",[NSThread currentThread]);
 });
  dispatch_async(queue, ^{
     NSLog(@"丑八怪啊-2-----%@",[NSThread currentThread]);
   });
dispatch_async(queue, ^{
      NSLog(@"丑八怪啊-3-----%@",[NSThread currentThread]);
   });
}
#注:会开线程,开一条线程,队列中的任务是依次执行的


NO.4 GCD异步函数+并发队列
-(void)asyncConcurrent
{
  //1.创建并发队列
dispatch_queue_t  queue = dispatch_queue_create( "123456", DISPATCH_QUEUE_CONCURRENT);
//2.封装任务(异步函数)
 dispatch_async(queue, ^{
    //打印一句话和当前线程
        NSLog(@"我爱你1-----%@",[NSThread currentThread]);
  });
dispatch_async(queue, ^{
      NSLog(@"我爱你2-----%@",[NSThread currentThread]);
    });
  dispatch_async(queue, ^{
      NSLog(@"我爱你3-----%@",[NSThread currentThread]);
   });
#注:会开启多条线程,队列中的任务是并发执行的
}
NO.5 GCD同步函数+主队列
-(void)syncMainQueue
{
   //1.获得主队列
    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]);
     });
}
#注:在主线程中执行,不会开线程
NO.6 GCD异步函数+主队列
-(void)asyncMainQueue
{
   //1.获得主队列
    dispatch_queue_t queue = dispatch_get_main_queue();
    //2.封装任务
    dispatch_async(queue, ^{
        //打印一句话和当前线程()
        NSLog(@"演员1-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
      NSLog(@"演员2-----%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
     NSLog(@"演员3-----%@",[NSThread currentThread]);
    });
}
#注:所有任务都在主线程中执行,不会开线程

GCD的常用函数

NO.1 延迟函数
//1.点击屏幕调用GCD方法
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //GCD里面的延迟方法
    [self delay];
}   
//GCD里面的延迟方法
-(void)delay
{
//获得全局并发队列  
 dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//GCD延迟函数 
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), queue, ^{
       [self task];
    });

}
//提供一个延迟调用的方法
-(void)task
{
 NSLog(@"我爱你---%@",[NSThread currentThread]);
}

NO.2 栅栏函数
#注:栅栏函数不能用在全局并发队列中,只能自己创建并发队列
//点击屏幕触发方法
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//1.创建并发队列
 dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
//2.异步函数
 //异步函数
    dispatch_async(queue, ^{
       NSLog(@"丑八怪1---%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"丑八怪2---%@",[NSThread currentThread]);
    });
  #实现需求:我们在1,2都执行完,才执行3(就可以用栅栏函数,拦截一下)
    dispatch_barrier_async(queue, ^{
        NSLog(@"------------------------------");
    });
   dispatch_async(queue, ^{
         NSLog(@"丑八怪3---%@",[NSThread currentThread]);
    });
}
#注:栅栏函数用来控制并发队列中的执行顺序

GCD线程间的通信

//点击屏幕下载一张图片(准备工作:在stroyboard拖一个UIImageView出来,把属性拖出来)
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
   #下载图片是一个耗时操作,我们放在子线程中去执行
   #创建子线程下载图片,用GCD的异步函数(这里只有一个任务用串行和并发的都行)
      dispatch_queue_t queue = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT);//并发队列

 //这段代码是在子线程中执行的
    dispatch_async(queue, ^{
      //下载图片
    //1.确定url
        NSURL *url = [NSURL URLWithString:@"http://img2.3lian.com/2014/f4/51/d/13.jpg"];
    //1.2 下载二进制数据到本地
   NSData *imageData = [NSData dataWithContentsOfURL:url];
      //1.3 将二进制数据转换为图片
        UIImage *image = [UIImage imageWithData:imageData];
//打印一下当前线程        
  NSLog(@"--%@",[NSThread currentThread]);
     # 现在图片有了,需要更新UI,就得回到主线程中
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
        NSLog(@"***%@",[NSThread currentThread]);
        });
     });
  }
}
#GCD中的线程通信函数是可以嵌套的
后记:GCD主要用法大概总结了一下,还有些用法可以根据Xmind技能图自行补充
上一篇下一篇

猜你喜欢

热点阅读