一 ) 为什么使用多线程?
每个iOS应用程序都有个专门用来更新显示UI界面、处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验。一般的解决方案就是将那些耗时的操作放到另外一个线程中去执行,多线程编程是防止主线程堵塞,增加运行效率的最佳方法。
这里有两个概念是进程和线程。 进程就是负责程序运行的内存分配,而线程就是进程中得一个独立的执行那个路径。它是程序的执行路径,负责程序中代码的实际运行。这好比进程就是火车,线程就是火车的车厢,没有火车,车厢也跑不起来当然一个火车也不能只有一个车厢。
二) iOS 中常用的三种多线程是什么?
1 Thread: 这是相对轻量级别的,抽象级别相对来说比较低,但是需要管理线程的生命周期,同步以及加锁,这会导致一定的性能开销
2 Operations: 这个是基于OC实现的,以面向对象的方式封装了需要执行的操作,我们可以不必关心线程的管理和同步的问题。它可以开始,取消线程执行。他有两个默认的实现方法:NSInvocationOperation和NSBlockOperation。当然我们也可以自定NSOperations,只有实现里面的main方法即可
3 GCD:也是重点讲的一个,它是ios4才开始使用的,当然现在我们ios9都出来了,GCD的成熟度足可以让我们放心的使用,它是基于C实现的,性能上要相对来说好一些,而且可以用最简单的代码去实现复杂的线程问题。
三) NSThread的基本使用方法
1.动态初始化
NSThread threadOne = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];
其中run是一个方法,我们通过方法来执行多线程中得处理
[_threadOne setName:@"one"];
给线程初始化一个别名
[_threadOne start];
开始执行
2 静态初始化
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
通过这一句代码我们就可以创建出另一个线程出来并去执行
3 创建隐式线程:
[self performSelectorInBackground:@selector(run) withObject:nil];
注:这是NSObject的一个方法,他可以让一个耗时间的处理放入后台去执行,但是在swift中抛弃了,原因是苹果觉得这个方法是线程不安全的
4 获取当前的线程
NSThread *current = [NSThread currentThread];
返回的是目前的线程
5 返回主线程(刷新UI控件必须在主线程中执行)
[self performSelectorOnMainThread:@selector(main:) withObject:nil waitUntilDone:YES];
6 等待(暂停)当前的线程
[NSThread sleepForTimeInterval:3.0f] ;
//3秒之后执行
或者
NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]];
[NSThread sleepUntilDate:date];
等待date完成后再去执行
注:前者是等待时间的完成,后者是等待数据的完成