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.并发 和 串行
基础的知识直接看文顶顶大神的,简单易懂,强大! 有上面的图片我们可以知道只有异步函数 加 并发队列才能实现开启新线程 和 并发执行任务,贴上文顶顶大神的一段代码:
第一种最值得讨论的情况:异步函数添加并发队列
分别运行三次,结果如下:
1.
2.
3.
我们惊讶的发现这几个异步执行的先后顺序是不可把控的,因为我们不知道线程在runloop执行的状态所以无法把控!
讨论另外一种情况异步函数添加串行队列:
很明显只开辟了一个线程(具备开辟新线程能力,这个线程是自己手动创建的,区别于上面的全局或者说后台线程,是系统分配的,可以同时创建多个的),因为在异步函数上赋予的是同一个线程,执行顺序必须等待先进入队列的完成后才执行block方法。故为同步执行,存在阻塞情况。
首推三篇好的文章:
文顶顶: 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方法。故为同步执行,存在阻塞情况。
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- C#控制台下测试多线程的方法
- Ruby 多线程的潜力和弱点分析