(1)GCD基本知识web
GCD:Grand central Dispatch 牛逼的中枢调度器
01 两个核心概念:队列和任务
使用步骤:1.定制任务,2.将任务添加到队列中(遵循先进先出的原则) 02 同步函数和异步函数
(2)GCD基本使用并发
01 异步函数+并发队列:开启多条线程,并发执行任务
app
02 异步函数+串行队列:开启一条线程,串行执行任务
异步
03 同步函数+并发队列:不开线程,串行执行任务
async
04 同步函数+串行队列:不开线程,串行执行任务
ide
05 异步函数+主队列:不开线程,在主线程中串行执行任务
函数
06 同步函数+主队列:不开线程,串行执行任务(注意死锁发生)
url
主队列特色:若是发现主线程当前正在执行代码(任务),那么主队列将不会调度队列里的任务,直到主线程的任务执行完毕
spa
07 注意同步函数和异步函数在执行顺序上面的差别
线程
(3)GCD线程间通讯
//0.获取一个全局的并发队列 dispatch_queue_t queue = dispatch_get_global_queue(0, 0); //1.先开启一个线程,把下载图片的操做放在子线程中处理 dispatch_async(queue, ^{ //2.下载图片 NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/zhidao/pic/item/6a63f6246b600c3320b14bb3184c510fd8f9a185.jpg"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; NSLog(@"下载操做所在的线程--%@",[NSThread currentThread]); //3.回到主线程刷新UI dispatch_async(dispatch_get_main_queue(), ^{ self.imageView.image = image; //打印查看当前线程 NSLog(@"刷新UI---%@",[NSThread currentThread]); }); });
(4)GCD其它经常使用函数
01 栅栏函数(控制任务的执行顺序) dispatch_barrier_async(queue, ^{ NSLog(@"--dispatch_barrier_async-"); });02 延迟执行(延迟·控制在哪一个线程执行) dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"---%@",[NSThread currentThread]); }); 03 一次性代码(注意不能放到懒加载) -(void)once { //整个程序运行过程当中只会执行一次 //onceToken用来记录:该部分的代码是否被执行过.若执行过,则不会进行操做. static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"-----"); }); } 04 快速迭代(开多个线程并发完成迭代操做) dispatch_apply(subpaths.count, queue, ^(size_t index) { }); 05 队列组(同栅栏函数) //建立队列组 dispatch_group_t group = dispatch_group_create(); //队列组中的任务执行完毕以后,执行该函数 dispatch_group_notify(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block);