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

iOS 多线程小结 ---- (NSThread)

2016-06-07 10:15 267 查看
一 ) 为什么使用多线程?

每个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完成后再去执行

注:前者是等待时间的完成,后者是等待数据的完成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息