一、多线程入门须知
1⃣️、当用户下载资源、进行图像处理、耗时数据处理等任务的时候 往往希望操作这个任务的时候 其他的操作不会被中断 这时候,就用到了多线程
2⃣️、在单线程中一个线程只能执行一个任务,一个任务处理不完另一个任务就不能开始,这样会影响用户的体验,让用户感觉APP卡顿。现在苹果手机都是多核处理器,这样我们可以把一个任务分成多个步骤,在不要求顺序的情况下 使用多线程既能解决线程阻塞 增加用户体验又能 充分利用多核处理器运行能力
3⃣️、每个应用程序的内部,存在一个或者多个执行线程,他同时或几乎同时执行不同的操作
4⃣️重要 面试题: 什么是进程,什么是线程,什么是多线程?
1、 线程与进程:每个系统运行的程序都是一个进程,每个进程里面包含了一个或者多个线程
2、 线程是一组指令的集合,程序中一个单一的顺序控制流程,是一个程序中独立运行的程序片段(一个应用程序里面,单一的顺序控制执行的一个任务)
3、 程序运行后,系统会创建一个main 主线程的线程,所有的UI控件都必须运行在主线程里面,所以也有人叫它UI线程 。如果将所有的任务都放在主线程里面,就会造成UI阻塞
4、多线程 : 在同一个应用程序内,同时运行多个线程,完成不同的工作,就叫做多线程
5⃣️、iOS 中几种多线程方式
iOS中有3种多线程策略供开发者使用 :NSThread、NSOperation(基类不可以直接使用 只能使用它的子类)、GCD(Grand Central Dispatch)
GCD 苹果推荐的一种实现 多线程的方式
6⃣️、轻量级 : 对系统框架的依赖性的程度
NSThread : 是这三种策略里面相对轻量级的,需要自己去管理它的生命周期,以及线程之间的同步,线程共享同一应用程序的部分内存空间,他们拥有对数据相同的访问权限,所以得协调多个线程对同一数据的访问,常用的做法是在访问之前加锁,这会导致一定的性能开销
二、NSThread 详解
设置一个白色小背景图,我们通过点击手势改变白色背景图的位置为点击的位置,设置一个button,当我们点击button时下载一张网络图片,作为小背景图的图片,在下载的过程中我们无法再次点击背景图,只有当下载完成后才能再次点击背景图。这时,我们为了让操作同步进行不影响,采用 多线程NSThread
1⃣️、在我们点击下载button后触发一个方法
- (void)downLoadImage
- {
NSThread *thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(downLoadOperation) object:nil];
thread2.name = @"下载图片线程2";
[thread2 start];
// 多个线程同时访问 一个数据
NSThread *thread3 = [[NSThread alloc]initWithTarget:self selector:@selector(downLoadOperation) object:nil];
thread3.name = @"下载图片线程3";
[thread3 start];
- }
- 2⃣️、线程触发的方法
- (void)downLoadOperation{
NSLog(@"下载线程:%@",[NSThread currentThread]);
// 模拟 下载 耗时的操作
sleep(5);
// 当操作完成后,刷新Ui 在主线程里面去刷新
// 从子线程回到主线程 去刷新UI界面
[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:YES];
point.backgroundColor = [UIColor brownColor];
}
3⃣️、下载完成后,到主线程刷新
- (void)updateUI
{
NSLog(@"当前线程:%@",[NSThread currentThread]);
point.backgroundColor = [UIColor brownColor];
}