简介
- NSOperation作用
NSOperation和NSOperationQueue也能实现多线程编程 - NSOperation和NSOperationQueue实现多线程的具体步骤
先将需要执行的操作封装到一个NSOperation对象中
然后将NSOperation对象添加到NSOperationQueue中
将取出的NSOperation封装的操作放到一条新线程中执行
NSOperation的子类
- NSOperation是个抽象类,并不具备封装操作的能力,必须使用他的子类
- 使用NSOperation子类的方式有3种
3.自定义类继承NSOperation,实现内部相应的方法
使用(没有配合队列使用,没有开启子线程)
第一种 NSInvocationOperation
- 第一个参数:目标对象 self
- 第二个参数:调用方法的名称
- 第三个参数:前面方法需要接受的参数 nil
1.创建操作,封装任务
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:<#(nonnull id)#> selector:<#(nonnull SEL)#> object:<#(nullable id)#>];
2.启动|执行操作
[op1 start];
第二种 NSBlockOperation
1.创建操作
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
<#code#>
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
<#code#>
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
<#code#>
}];
2.追加任务(开启子线程)
//注意:如果一个操作中的任务量大于1,那么会开子线程并发执行任务
//注意:不一定是子线程,有可能是主线程
[op1 addExecutionBlock:^{
<#code#>
}];
[op2 addExecutionBlock:^{
<#code#>
}];
[op3 addExecutionBlock:^{
<#code#>
}];
3.启动|执行操作
[op1 start];
配合队列使用(开启子线程)
NSOperation:
主队列:[NSOperationQueue mainQueue] 和GCD中的主队列一样,串行队列
非主队列:[[NSOperationQueue alloc] init] 非常特殊(同时具备并发和串行的功能)
//默认情况下,非主队列是并发队列
第一种 NSInvocationOperation
- 第一个参数:目标对象 self
- 第二个参数:调用方法的名称
- 第三个参数:前面方法需要接受的参数 nil
1.创建操作,封装任务
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:<#(nonnull id)#> selector:<#(nonnull SEL)#> object:<#(nullable id)#>];
NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:<#(nonnull id)#> selector:<#(nonnull SEL)#> object:<#(nullable id)#>];
2.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
3.添加操作到队列中
[queue addOperation:op1]; //内部已经调用了[op1 start];---->main方法
[queue addOperation:op2];
第二种 NSBlockOperation
1.创建操作
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
<#code#>
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
<#code#>
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
<#code#>
}];
追加任务(开启子线程)
//注意:如果一个操作中的任务量大于1,那么会开子线程并发执行任务
//注意:不一定是子线程,有可能是主线程
[op1 addExecutionBlock:^{
<#code#>
}];
[op2 addExecutionBlock:^{
<#code#>
}];
[op3 addExecutionBlock:^{
<#code#>
}];
2.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
3.添加操作到队列中
[queue addOperation:op1]; //内部已经调用了[op1 start];
[queue addOperation:op2];
[queue addOperation:op3];
简便方法
1)创建操作
2)添加操作到队列中
[queue addOperationWithBlock^{
<#code#>
}];
线程间通信
直接嵌套就好,利用主队列创建任务,任务就会在主队列中执行
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
}];