OC底层原理27:GCD之 NSThread & GCD & NSOperation
前言
本文主要目的是介绍 NSThread、GCD、NSOperation
常见的使用方式
NSThread
NSThread
是苹果官方提供 面向对象
的线程操作技术,是对 thread
的上层封装,比较偏向于底层,简单方便,可以直接操作线程对象,使用频率较少
创建线程
线程的创建方式主要有以下三种方式
通过
init
初始化方式创建,需要手动启动通过
detachNewThreadSelector
构造器方式创建通过
performSelector...
方式创建,主要是用于获取主线程
,以及后台线程
1 | - (void)createNSThread{ |
属性
1 | - thread.executing // 线程是否在执行 |
类方法
常用的类方法有以下几个:
currentThread:获取当前线程
sleep…:阻塞线程
exit:退出线程
mainThread:获取主线程
1 | - (void)threadClassMethod{ |
实际使用
- 根据若⼲个url异步加载多张图⽚,然后在都下载完成后合成⼀张整图?GCD如何实现?
dispatch_group_t + dispatch_group_enter + dispatch_group_leave + dispatch_group_notify
1 | -(void)Btn{ |
dispatch_group_enter:通知group,下面的任务马上要放到group中执行了。
dispatch_group_leave:通知group,任务完成了,该任务要从group中移除了。
dispatch_group_notify:通知线程组中的任务都完成了
- 10个网络请求顺序回调?
dispatch_semaphore_t:信号量
1 | -(void)Btn{ |
GCD
dispatch_after
1 | - (void)testAfter{ |
dispath_once
1 | - (void)testOnce{ |
dispach_apply
1 | - (void)testApply{ |
dispatch_group_t
有以下两种使用方式
- 方式一:使用
dispatch_group_t + dispatch_group_notify
1 | - (void)testGroup1{ |
- 【方式二】使用
dispatch_group_enter + dispatch_group_leave + dispatch_group_notify
1 | - (void)testGroup2{ |
- 在方式二的基础上增加超时 dispatch_group_wait
1 | - (void)testGroup3{ |
dispatch_barrier_sync & dispatch_barrier_async
栅栏函数,主要有两种使用场景:串行队列、并发队列
1 | - (void)testBarrier{ |
dispatch_semaphore_t
信号量主要作用于同步锁,用于控制 GCD
最大并发数
1 | - (void)testSemaphore{ |
由上面的代码可知,在使用信号量之前的打印结果是无序的:
1 | 2022-02-23 08:59:56.276005+0800 NSThread_Demo[5019:3790181] 当前 - 1,线程 - <NSThread: 0x2825f0c00>{number = 4, name = (null)} |
由上面的代码可知,在使用信号量之后,打印的结果是有序的,如下:
1 | 2022-02-23 08:59:56.276197+0800 NSThread_Demo[5019:3790186] 当前 - 0 线程 - <NSThread: 0x2825f3880>{number = 8, name = (null)} |
dispatch_source_t
dispatch_source_t
主要用于计时操作,其原因是因为它创建的timer不依赖于Runloop,且计时精准度比 NSTimer
高,dispatch_source_t
有一点必须要设值为属性,否则会被立即释放
1 | - (void)testSource{ |
NSOperation
NSOperation
是基于 GCD
之上的更高一层的封装, NSOpetation
需要配合 NSOpetationQueue
来实现多线程
NSOpetation
实现多线程的步骤如下:
- 创建任务:先将需要执行的操作封装到
NSOperation
对象中。 - 创建队列:创建
NSOperationQueue
。 - 将任务加入到队列中:将
NSOperation
对象添加到NSOperationQueue
中。
1 | - (void)testBaseNSOperation{ |
需要注意的是,NSOperation
是个抽象类,实际运用时中需要使用它的子类,有三种方式:
- 使用子类
NSInvocationOperation
1 | - (void)createNSOperation{ |
- 使用子类
NSBlockOperation
1 | - (void)testBlockOperationExecution{ |
- 定义继承自
NSOperation
的子类,通过实现内部相应的方法来封装任务
1 | // 自定义继承自NSOperation的子类 |
NSOperationQueue
NSOperationQueue添加事务
NSOperationQueue
有两种队列:主队列、其他队列。其他队列包含了 串行和并发。
主队列:
主队列
上的任务时在主线程
执行的其他队列(非主队列):加入到
非队列
中的任务默认就是并发
,开启多线程
1 | - (void)testNSOperationQueue{ |
设值执行顺序
1 | - (void)testQueueSequence{ |
设置优先级
1 | - (void)testOperationQuality{ |
设置并发数
1 | - (void)testOperationMaxCount{ |
添加依赖
1 | - (void)testOperationDependency{ |
线程间通讯
1 | - (void)testOperationNoti{ |
- Post title:OC底层原理27:GCD之 NSThread & GCD & NSOperation
- Post author:张建
- Create time:2021-03-23 14:59:47
- Post link:https://redefine.ohevan.com/2021/03/23/OC底层原理/OC底层原理27:GCD之 NSThread & GCD & NSOperation/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.