GCD - 1

来源:互联网 发布:搜索网站排名优化策略 编辑:程序博客网 时间:2024/05/16 03:20

上几篇我们学习了iOS中对线程控制最直观的类NSThread,这里我们进入iOS对于多线程强大的机制GCD

首推三篇好的文章:

文顶顶: http://www.cnblogs.com/wendingding/p/3806821.html

kenshicui:http://www.cnblogs.com/kenshincui/p/3983982.html#GCD

简书:http://www.jianshu.com/p/0b0d9b1f1f19


先从头文件开始对GCD的学习:

iOS的GCD是全C的风格的,由这个文件所提供:


iOS提供了大量的关于GCD的方法,我们这里并不全部详述,而挑出重点的来讲述,学习基本的类和方法之前来了解一下基础的知识,这里直接转用上面参考的文顶顶大神的图,十分详述易懂!

我们要了解的几个概念是:

1.并发队列 和 串行队列

2.同步 和 异步

3.并发 和 串行



基础的知识直接看文顶顶大神的,简单易懂,强大! 有上面的图片我们可以知道只有异步函数 加 并发队列才能实现开启新线程 和 并发执行任务,贴上文顶顶大神的一段代码:

第一种最值得讨论的情况:异步函数添加并发队列

//用异步函数往并发队列添加任务- (void)viewDidLoad{    [super viewDidLoad];    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    dispatch_async(queue, ^{        NSLog(@"下载图片1 ---- %@", [NSThread currentThread]);    });    dispatch_async(queue, ^{        NSLog(@"下载图片2 ---- %@", [NSThread currentThread]);    });    dispatch_async(queue, ^{        NSLog(@"下载图片3 ---- %@", [NSThread currentThread]);    });    NSLog(@"主线程 --- %@", [NSThread mainThread]);}

分别运行三次,结果如下:

1.


2.


3.


我们惊讶的发现这几个异步执行的先后顺序是不可把控的,因为我们不知道线程在runloop执行的状态所以无法把控!



讨论另外一种情况异步函数添加串行队列:

//用异步函数往串行队列中添加任务- (void)viewDidLoad{    [super viewDidLoad];        NSLog(@"主线程 --- %@", [NSThread mainThread]);            dispatch_queue_t queue = dispatch_queue_create("async_series", NULL);        dispatch_async(queue, ^{                NSLog(@"下载图片1 ---- %@", [NSThread currentThread]);            });        dispatch_async(queue, ^{                NSLog(@"下载图片2 ---- %@", [NSThread currentThread]);            });        dispatch_async(queue, ^{                NSLog(@"下载图片3 ---- %@", [NSThread currentThread]);            });}



很明显只开辟了一个线程(具备开辟新线程能力,这个线程是自己手动创建的,区别于上面的全局或者说后台线程,是系统分配的,可以同时创建多个的),因为在异步函数上赋予的是同一个线程,执行顺序必须等待先进入队列的完成后才执行block方法。故为同步执行,存在阻塞情况。








0 0
原创粉丝点击