官网文档:NSThreadClass Reference
GCD class Reference
一、 基本知识
1、 一个程序会产生一个主线程(MainThread),主线程专门处理UIKit对象的操作
2、 耗时的操作放在其他线程,放在后台处理。
3、 为了线程安全(Thread-safe),当线程对某个对象操作时,会使用”锁”机制,即会对操作的对象上锁,其他线程不能访问该对象,
4、 在OC语言编写的程序中,当给一个自定义类中添加属性的时候,属性关键字其中就有:atomic和nonatomic的区分,其中:atomic是线程安全的,当有线程访问这个属性时,会为该属性的setter方法加锁,atomic是默认值。但是,我们在实际的开发中,都会把给属性设置nonatomic关键字,因为对于移动设备来说,效率更加重要,但也需要程序员注意线程安全问题
二、 NSThread
官网文档:NSThreadClass Reference
文档介绍怎么初始化,开始,结束,等
可以用来获取线程类的属性
由于生命周期需要手动管理,有更好的代替,见下文
三、 GCD(GrandCentral Dispatch)
1、 自己管理生命周期,使用的是C语言,我们只需要使用它去做什么,在Swift中使用Block(闭包)
2、 是苹果公司为多核并行运算自动合理利用CPU提出的解决问题
3、 任务/操作:一段闭包代码,有两种执行方式:
同步执行:会阻塞当前线程并等待Block中的任务执行完毕,之后当前线程才继续往下运行。
异步执行:当前线程直接往下执行,它不会阻碍当前线程。
相关函数:
dispatch_async(dispatch_queue_t queue,dispatch_block_t block);//异步任务
dispatch_sync(dispatch_queue_t queue,dispatch_block_t block);//同步任务
4、 队列:用于存放任务
串行队列:放到串行队列的任务,GCD 会 FIFO(先进先出) 地取出来一个,执行一个,然后取下一个,这样一个一个的执行
并行队列:放在并行队列中的任务,GCD会按FIFO的取出来,但不同的是,它取出来一个就会放到别的线程,然后再取出来一个又放到另一个的线程。这样由于取的动作很快,忽略不计,看起来,所有的任务都是一起执行的。不过需要注意,GCD 会根据系统资源控制并行的数量,所以如果任务很多,它并不会让所有任务同时执行
创建队列函数:
dispatch_get_main_queue(void);//获取主队列
//创建串行队列
letqueue = dispatch_queue_create("tk.bourne.testQueue", nil);
letqueue = dispatch_queue_create("tk.bourne.testQueue", DISPATCH_QUEUE_SERIAL)【serial:串行的】
//创建并行队列
letqueue = dispatch_queue_create("tk.bourne.testQueue", DISPATCH_QUEUE_CONCURRENT)【concurrent:并发的】
let queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)//全局并行队列(一般并行任务都加入这个队列)
第一个参数表示唯一标识队列的参考符,可以为nil.第二个参数表示创建队列类型(DISPATCH_QUEUE_SERIAL/串行 DISPATCH_QUEUE_CONCURRENT/并行)
总结见下表:
队列组
将很多队列添加到一个组里,当组内所有的任务都完成,才会使用一个方法通知我们
//1.创建队列组
dispatch_group_t group =dispatch_group_create();
//执行任务,只有异步方法
dispatch_group_async(groupName,queue){block}|
//4.都完成后会自动通知
dispatch_group_notify(group,dispatch_get_main_queue()) { () -> Void in
}
提示:可以使用NSLog(NSThread.currentThread())打印进程信息
5、 队列创建等见简书--关于ios线程,你看我就够了
6、 线程间通信(通过嵌入子任务实现)
在涉及网络数据获取的过程中,一般会使用异步任务+并发队列进行数据获取,当获取到网络服务器返回的数据后,需要在主线程中把数据显示在屏幕上,因此这就涉及到线程间的通信。在并行队列中的任务中,还可以嵌套子任务,嵌套的子任务可以设置为在主/其他线程中执行的任务(实例参考:宏创学院»GCD使用介绍:2-线程间通信 »GCD使用介绍:3-队列组dispatch group)
现在的进程进程管理使用的是NSOperation及子类,看下一篇博客
详细学习讲解参考:简书--关于ios线程,你看我就够了