#import "viewcontroller.h" @interface viewcontroller ()@end @implementation viewcontroller-(void)touchesbegan:(nsset<uitouch *> *)touches withevent:(uievent *)event { [self blockoperation]; }/** * 1:nsoperation封装任务的两种方式:nsinvocationoperation,nsblockoperation,其中两种方法若没指定队列,则默认是在主队列里去执行 2:住家任务:addexecutionblock: 注意:如果一个操作中的任务数量大于1,那么会开子线程并发执行任务 注意:不一定是子线程,有可能是主线程 */ -(void)invocationopeation { //1.创建操作,封装任务 /* 第一个参数:目标对象 self 第二个参数:调用方法的名称 第三个参数:前面方法需要接受的参数 nil */ nsinvocationoperation *op1 = [[nsinvocationoperation alloc]initwithtarget:self selector:@selector(download1) object:nil]; nsinvocationoperation *op2 = [[nsinvocationoperation alloc]initwithtarget:self selector:@selector(download2) object:nil]; nsinvocationoperation *op3 = [[nsinvocationoperation alloc]initwithtarget:self selector:@selector(download3) object:nil]; //2.启动|执行操作 [op1 start]; [op2 start]; [op3 start]; }-(void)blockoperation { //1.创建操作 nsblockoperation *op1 = [nsblockoperation blockoperationwithblock:^{ nslog(@"1----%@",[nsthread currentthread]); }]; nsblockoperation *op2 = [nsblockoperation blockoperationwithblock:^{ nslog(@"2----%@",[nsthread currentthread]); }]; nsblockoperation *op3 = [nsblockoperation blockoperationwithblock:^{ nslog(@"3----%@",[nsthread currentthread]); }]; //追加任务 //注意:如果一个操作中的任务数量大于1,那么会开子线程并发执行任务 //注意:不一定是子线程,有可能是主线程 [op3 addexecutionblock:^{ nslog(@"4---%@",[nsthread currentthread]); }]; [op3 addexecutionblock:^{ nslog(@"5---%@",[nsthread currentthread]); }]; [op3 addexecutionblock:^{ nslog(@"6---%@",[nsthread currentthread]); }]; //2.启动 [op1 start]; [op2 start]; [op3 start]; }-(void)download1 { nslog(@"%s----%@",__func__,[nsthread currentthread]); }-(void)download2 { nslog(@"%s----%@",__func__,[nsthread currentthread]); }-(void)download3 { nslog(@"%s----%@",__func__,[nsthread currentthread]); }@end
###2.nsoperation
- 2.1 nsoperation基本使用
(1)相关概念
01 nsoperation是对gcd的包装
02 两个核心概念【队列+操作】
(2)基本使用
01 nsoperation本身是抽象类,只能只有它的子类
02 三个子类分别是:nsblockoperation、nsinvocationoperation以及自定义继承自nsoperation的类
03 nsoperation和nsoperationqueue结合使用实现多线程并发
(3)相关代码
```objc
// 01 nsinvocationoperation
//1.封装操作
/*
第一个参数:目标对象
第二个参数:该操作要调用的方法,最多接受一个参数
第三个参数:调用方法传递的参数,如果方法不接受参数,那么该值传nil
*/
nsinvocationoperation *operation = [[nsinvocationoperation alloc]
initwithtarget:self selector:@selector(run) object:nil];
//2.启动操作
[operation start];
-------------------------------------------------
// 02 nsblockoperation
//1.封装操作
/*
nsblockoperation提供了一个类方法,在该类方法中封装操作
*/
nsblockoperation *operation = [nsblockoperation blockoperationwithblock:^{
//在主线程中执行
nslog(@"---download1--%@",[nsthread currentthread]);
}];
//2.追加操作,追加的操作在子线程中执行
[operation addexecutionblock:^{
nslog(@"---download2--%@",[nsthread currentthread]);
}];
[operation addexecutionblock:^{
nslog(@"---download3--%@",[nsthread currentthread]);
}];
//3.启动执行操作
[operation start];
----------------------------------------------
// 03 自定义nsoperation
//如何封装操作?
//自定义的nsoperation,通过重写内部的main方法实现封装操作
-(void)main
{
nslog(@"--main--%@",[nsthread currentthread]);
}
//如何使用?
//1.实例化一个自定义操作对象
xmgoperation *op = [[xmgoperation alloc]init];
//2.执行操作
[op start];
```
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!