多线程(第二篇)
来源:互联网 发布:酷酷跑软件 编辑:程序博客网 时间: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中实现多线程主要有三种方案
- NSThread : 直接操作线程对象,只是偶尔用 [NSThread currentThread] 来获取当前线程,看到NS就知道他是用OC语言,生命周期多半有系统管理,我们只是偶尔管理一下。
- GCD:牛逼的多线程方案,C语言的,在开发中如果用到多线程基本就是它了(有些片面,这只是我看到的)系统制动管理它的生命周期,能够充分利用设备的多核,苹果推出它就是为了取代NSThread。
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,这两篇概念东西比较多,先来点湿的,后续来点干的。
- 多线程(第二篇)
- Java多线程 - 第二篇
- 演绎linux多线程.第二篇
- python多线程编程第二篇
- 多线程第二章(1)
- LinuxC多线程编程第二篇:线程终止
- LinuxC多线程编程第二篇:线程终止
- C++多线程-第二篇-Mutex(互斥量)
- 多线程学习第二篇之传统定时器
- win32多线程程序设计笔记(第二章)
- Java多线程编程(第二章)
- 面试知识点(第二弹:多线程)
- java多线程(第二种方式)
- 秒杀多线程第二篇 多线程第一次亲密接触
- 多线程第二篇 多线程中的隐蔽问题揭秘
- 55.多线程第二章(常用的开启多线程方法)
- Linux下C语言多线程(第二篇)线程互斥pthread_mutex_t()
- C#多线程编程实战(从入门到精通系列)第二篇 指定间隔终止线程
- java中的多线程
- WebService——访问技术
- 一文让你彻底了解iOS字体相关知识
- Android开发性能优化大总结
- 并查集-HDU-3038-How Many Answers Are Wrong
- 多线程(第二篇)
- android小问题-------------android模拟器没有SD卡,SD卡状态为removed的解决方式
- AJAX
- Android开发者必知的开发资源
- MaTeX:在Mathematica的图片中插入LaTeX代码的工具
- const 与static
- visual studio 2010安装失败
- 15.static的作用
- 【笔记】java获取文件扩展名