多线程(第二篇)

来源:互联网 发布:酷酷跑软件 编辑:程序博客网 时间:2024/06/05 21:01

多线程
—一个iOS程序打开(启动)会默认开启一条线程我们称之为主线程或UI线程。
主线程的作用:
a. 用于显示和刷新UI界面
b. 处理一些UI事件(比如滚动事件,点击事件,拖拽事件等)

注意点:
不能将耗时的操作(比如下载文件,打印日志)放在主线程中,否则会造成卡顿现象,造成用户体验下降。
举例:如图这里写图片描述
当你下载文件时,比如第五分钟开始拖拽tableview这是tableview不会有反应,只有当文件下载完毕,才会处理tableview的拖拽事件,因为下载文件和处理tableview的拖拽都在主线程当中做,而线程是串行执行的,也就是一个一个执行。也就是要再过15分钟,表格才会有反应。如果把下载文件放在子线程当中,就会线程与线程之间并发执行。表格就会立即有反应。你也可以自己演示一下,只需建立一个简单的项目,在storyboard中拖拽一个按钮,监听按钮的点击事件,在里面打印log日志(打印log日志也属于耗时操作),for循环10000次,再拖一个tableview,实现tableview的代理和数据源方法,当点击按钮时,拖拽tableview看看是否立即有反应。

二.在iOS中实现多线程主要有三种方案

  1. NSThread : 直接操作线程对象,只是偶尔用 [NSThread currentThread] 来获取当前线程,看到NS就知道他是用OC语言,生命周期多半有系统管理,我们只是偶尔管理一下。
  2. GCD:牛逼的多线程方案,C语言的,在开发中如果用到多线程基本就是它了(有些片面,这只是我看到的)系统制动管理它的生命周期,能够充分利用设备的多核,苹果推出它就是为了取代NSThread。
  3. NSOperation:底层是基于GCD的,既然底层基于GCD,那么它肯定在某些方面比GCD更加好用,也更加面向对象,不需要开发者手动管理内存,这个用的也比较多,我们常用的第三方框架,比如SDWebimage,就是自定义NSOperation,这有些高级后续有时间再聊。

    三.第一种NSThread的用法

    a. 首先我们要创建线程

[NSThread alloc]initWithTarget:<#(nonnull id)#> selector:<#(nonnull SEL)#> object:<#(nullable id)#>

Target:对象,non null为iOS9新出的属性修饰符意为不能为空。
selector:调用对象的哪一个方法。
object:用于传递方法的参数,nullable:可以为空。
举例:

 // 创建线程    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(love:) object:@"女朋友"];     // 启动线程    [thread start];

这时把耗时的操作放在love:方法里面,并把女朋友传递过去,比如耗时的操作,做饭呀,洗碗呀,打扫卫生呀(哈哈)。如果你女朋友月薪2万,你月薪1万。那还是你做饭,打扫卫生吧!

b.第二种创建线程

+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;

detach英文意为:分离,分派,派遣;
各个参数的含义和上面一种类似。
举例:

[NSThread detachNewThreadSelector:@selector(love:) toTarget:self withObject:@"女朋友"];

此方法不需要启动线程,把耗时操作放在love:方法里面即可。

知道上面两种基本就可以啦,其实还有很多种,没必要了解,如果想研究的话,可以点击NSThread进入头文件看一下。
还有一个比较常用的类方法

+ (NSThread *)currentThread;//获得当前线程。(重点)+ (NSThread *)mainThread; // 获得主线程(了解)- (BOOL)isMainThread; // 是否为主线程(了解)+ (BOOL)isMainThread; // 是否为主线程(了解) - (NSString *)name;//线程起名字(了解)

今天就写到这,以后将重点介绍GCD和NSOperation,这两篇概念东西比较多,先来点湿的,后续来点干的。

2 0
原创粉丝点击