IOS--UI--NSOperation

NSOperation 的作用
1.配合使用 NSOperation 和 nsoperationQueue 也能实现多线程编程
注: NSOperation 是一个抽象类,不具备封装操作的能力,需要使用子类
①NSInvocationOperation
②NSBlockOperation
③自定义子类继承 NSOperation 实现内部方法

2.步骤
1>需要的执行操作封装到一个NSOperation 对象中;
2> 然后将 NSOperation 对象添加到NSOperationQueue 中
3>系统会自动将 nsoperationQueue 中的 NSOperation 取出来
4>将取出的 SOperation 封装的操作放到一条新线程中执行;

①NSInvocationOperation

.m
- (void)viewDidLoad {
    [super viewDidLoad];

    //封装操作 也就是创造操作对象 封装需要操作的任务
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download ) object:nil];

//    执行操作 start 启动上面的方法 默认主线程
    [operation start];



}
- (void)download
{
    NSLog(@"123%@",[NSThread currentThread]);
}
//只有放在NSOperationQueue 中才会异步执行

②NSBlockOperation

-(void)blockOperation{
//    1.封装操作

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

       NSLog(@"1--%@",[NSThread currentThread]);
}];
//通过-(void)addExecutionBlock:(void)(^)bloack; 添加更多操作
        [operation addExecutionBlock:^{
            NSLog(@"2--%@",[NSThread currentThread]);
        }];

        [operation addExecutionBlock:^{
            NSLog(@"3--%@",[NSThread currentThread]);
        }];



//    执行操作
    [operation start];
}

注:只有 NSBlockOperation 的封装操作>1 才会开启异步执行

-(void)queue{
    //并发对列
    //封装操作
      NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download ) object:nil];
      NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector( run  ) object:nil];
    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"1--%@",[NSThread currentThread]);
    }];
    [operation3 addExecutionBlock:^{
        NSLog(@"2--%@",[NSThread currentThread]);
    }];
    //创建队伍
    NSOperationQueue *queue=[[NSOperationQueue alloc]init];

//    将操作加入队伍中
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];

}

注:
1.取出任务是有顺序的 但是任务是一起进行的
2.不需要加 start 方法

  1. 队伍的操作
    ①取消
    -(void)cancelAllOperation;

②恢复和暂停队伍
BOOL setSuspended
YES 暂停 NO 恢复

③ 优先级
这里写图片描述

④操作依赖
① 同一队伍内的NSOperation 可以依靠依赖关系 来保证执行顺序

    [operation2 addDependency:operation3];
//操作2 依赖操作1 要等1 做完之后2 才会做

② 在不同对列之间设置依赖 但不能相互依赖

//Error
 [operation2 addDependency:operation3];
  [operation3 addDependency:operation2];

④ 监听操作

-(void)operationListen{
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"1--%@",[NSThread currentThread]);
    }];
    operation.completionBlock = ^{
          //下载完 之后想做的事情
        NSLog(@"下载完毕----%@",[NSThread currentThread]);
    };

    //创建队伍
    NSOperationQueue *queue=[[NSOperationQueue alloc]init];

    [queue addOperation:operation];

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值