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中的线程通信函数是可以嵌套的