您的位置:首页 > 移动开发 > IOS开发

GCD - 1

2015-10-30 11:24 429 查看
上几篇我们学习了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方法。故为同步执行,存在阻塞情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS gcd 多线程