【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结.doc

上传人:bao****ty 文档编号:132221985 上传时间:2020-05-13 格式:DOC 页数:15 大小:114.50KB
返回 下载 相关 举报
【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结.doc_第1页
第1页 / 共15页
【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结.doc_第2页
第2页 / 共15页
【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结.doc_第3页
第3页 / 共15页
【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结.doc_第4页
第4页 / 共15页
【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结.doc》由会员分享,可在线阅读,更多相关《【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结.doc(15页珍藏版)》请在金锄头文库上搜索。

1、【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结OC中的多线程OC中多线程根据封装程度可以分为三个层次:NSThread、GCD和NSOperation,另外由于OC兼容C语言,因此仍然可以使用C语言的POSIX接口来实现多线程,只需引入相应的头文件:#include 。NSThreadNSThread是封装程度最小最轻量级的,使用更灵活,但要手动管理线程的生命周期、线程同步和线程加锁等,开销较大;NSThread的基本使用比较简单,可以动态创建初始化NSThread对象,对其进行设置然后启动;也可以通过NSThread的静态方法快速创建并启动新线程;此外NSOb

2、ject基类对象还提供了隐式快速创建NSThread线程的performSelector系列类别扩展工具方法;NSThread还提供了一些静态工具接口来控制当前线程以及获取当前线程的一些信息。下面以在一个UIViewController中为例展示NSThread的使用方法:- (void)viewDidLoad super viewDidLoad; /* NSThread静态工具方法 */ /* 1 是否开启了多线程 */ BOOL isMultiThreaded = NSThread isMultiThreaded; /* 2 获取当前线程 */ NSThread *currentThrea

3、d = NSThread currentThread; /* 3 获取主线程 */ NSThread *mainThread = NSThread mainThread; NSLog(in thread); /* 4 睡眠当前线程 */ /* 4.1 线程睡眠5s钟 */ NSThread sleepForTimeInterval:5; /* 4.2 线程睡眠到指定时间,效果同上 */ NSThread sleepUntilDate:NSDate dateWithTimeIntervalSinceNow:5; /* 5 退出当前线程,注意不要在主线程调用,防止主线程被kill掉 */ /NST

4、hread exit; NSLog(main thread); /* NSThread线程对象基本创建,target为入口函数所在的对象,selector为线程入口函数 */ /* 1 线程实例对象创建与设置 */ NSThread *newThread= NSThread alloc initWithTarget:self selector:selector(run) object:nil; /* 设置线程优先级threadPriority(01.0),即将被抛弃,将使用qualityOfService代替 */ newThread.threadPriority = 1.0; newThre

5、ad.qualityOfService = NSQualityOfServiceUserInteractive; /* 开启线程 */ newThread start; /* 2 静态方法快速创建并开启新线程 */ NSThread detachNewThreadSelector:selector(run) toTarget:self withObject:nil; NSThread detachNewThreadWithBlock: NSLog(block run.); ; /* NSObejct基类隐式创建线程的一些静态工具方法 */ /* 1 在当前线程上执行方法,延迟2s */ sel

6、f performSelector:selector(run) withObject:nil afterDelay:2.0; /* 2 在指定线程上执行方法,不等待当前线程 */ selfperformSelector:selector(run)onThread:newThreadwithObject:nil waitUntilDone:NO; /* 3 后台异步执行函数 */ self performSelectorInBackground:selector(run) withObject:nil; /* 4 在主线程上执行函数 */ self performSelectorOnMainTh

7、read:selector(run) withObject:nil waitUntilDone:NO;- (void)run NSLog(run.);GCD大中央调度GCD(Grand Central Dispatch),又叫大中央调度,对线程操作进行了封装,加入了很多新的特性,内部进行了效率优化,提供了简洁的C语言接口,使用更加简单高效,也是苹果推荐的方式。同步dispatch_sync与异步dispatch_async任务派发串行队列与并发队列dispatch_queue_tdispatch_once_t只执行一次dispatch_after延后执行dispatch_group_t组调度两

8、个关键概念串行与并发(Serial和Concurrent):这个概念在创建操作队列的时候有宏定义参数,用来指定创建的是串行队列还是并行队列。串行指的是队列内任务一个接一个的执行,任务之间要依次等待不可重合,且添加的任务按照先进先出FIFO的顺序执行,但并不是指这就是单线程,只是同一个串行队列内的任务需要依次等待排队执行避免出现竞态条件,但仍然可以创建多个串行队列并行的执行任务,也就是说,串行队列内是串行的,串行队列之间仍然是可以并行的,同一个串行队列内的任务的执行顺序是确定的(FIFO),且可以创建任意多个串行队列;并行指的是同一个队列先后添加的多个任务可以同时并列执行,任务之间不会相互等待,

9、且这些任务的执行顺序执行过程不可预测。同步和异步任务派发(Synchronous和Asynchronous):GCD多线程编程时经常会使用dispatch_async和dispatch_sync函数往指定队列中添加任务块,区别就是同步和异步。同步指的是阻塞当前线程,要等添加的耗时任务块block完成后,函数才能返回,后面的代码才可以继续执行。如果在主线上,则会发生阻塞,用户会感觉应用不响应,这是要避免的。而有时需要使用同步任务的原因是想保证先后添加的任务要按照编写的逻辑顺序依次执行;异步指的是将任务添加到队列后函数立刻返回,后面的代码不用等待添加的任务完成返回即可继续执行。dispatch_s

10、ync与dispatch_async通过下面的代码比较异步和同步任务的区别:/* 1. 提交异步任务 */NSLog(开始提交异步任务:);dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), /* 耗时任务. */ NSThread sleepForTimeInterval:10;);NSLog(异步任务提交成功!);/* 2. 提交同步任务 */NSLog(开始提交同步任务:);dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_P

11、RIORITY_DEFAULT, 0), /* 耗时任务. */ NSThread sleepForTimeInterval:10;);NSLog(同步任务提交成功!);打印结果:2017-02-28 16:01:44.643 SingleView19100:708069 开始提交异步任务:2017-02-28 16:01:44.643 SingleView19100:708069 异步任务提交成功!2017-02-28 16:01:44.644 SingleView19100:708069 开始提交同步任务:2017-02-28 16:01:54.715 SingleView19100:70

12、8069 同步任务提交成功!通过打印结果的时间可以看出,异步任务提交后立即就执行下一步打印提交成功了,不会阻碍当前线程,提交的任务会在后台去执行;而提交同步任务要等到提交的后台任务结束后才可以继续执行当前线程的下一步。此处在主线程上添加的同步任务就会阻塞主线程,导致后面界面的显示要延迟,影响用户体验。dispatch_queue_t 操作队列主要有两种,并发队列和串行队列,它们的区别上面已经提到,具体创建的方法很简单,要提供两个参数,一个是标记该自定义队列的唯一字符串,另一个是指定串行队列还是并发队列的宏参数:/* 创建一个并发队列 */dispatch_queue_t concurrent_

13、queue = dispatch_queue_create(demo.gcd.concurrent_queue, DISPATCH_QUEUE_CONCURRENT);/* 创建一个串行队列 */dispatch_queue_t serial_queue = dispatch_queue_create(demo.gcd.serial_queue, DISPATCH_QUEUE_SERIAL);另外GCD还提供了几个常用的全局队列以及主队列,获取方法如下:/ 获取主队列(在主线程上执行)dispatch_queue_t main_queue = dispatch_get_main_queue()

14、;/ 获取不同优先级的全局队列(优先级从高到低)dispatch_queue_t queue_high = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);dispatch_queue_t queue_default = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_queue_t queue_low = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);dispatch_queue_t queue_background = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);dispatch_once_t 这个函数控制指定代码只会被执行一次,常用来实现单例模式,这里以单例模式实现的模板代码为例展示dispatch_once_t的用法,其中的实例化语句只会被执行一次:+ (instancetype *)sharedInstance static dispatch_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号