多线程之 NSOperation 与 NSOperationQueue 的基本操作 适合基础学习

 使用NSOperation NSOperationQueue实现多线程编程 的详解

 1 先将需要执行的操作封装到一个NSOperation对象中

 2 然后将NSOperation对象添加到NSOperationQueue

 3 系统会自动将NSOperation中封装的操作放到一条新线程中执行此过程你根本不需要考虑生命周期,同步,加锁问题等;


 NSOperation步骤;

 NSOperation并不具备封装操作的能力,必须使用它的子类,使用NSOperation子类的方式有3种:

 1> NSInvocationOperation

 2> NSBlockOperation

 3> 自定义子类继承NSOperation,实现内部相应的方法


NSOperationQueue操作是可以把线程封装起来;不是同步是异步获取数据,也不需要考虑生命周期


- (void)viewDidLoad

{

    [super viewDidLoad];

    

    [self loadOperation];

}


//把封装的线程数据添加到队列中

- (void)loadOperation

{

  NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    

    NSBlockOperation *operation1 =  [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"operation1%@",[NSThread currentThread]);

    }];

    NSBlockOperation *operation2 =  [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"operation2%@",[NSThread currentThread]);

    }];

  

    // 一个NSOperation被添加到队列中会马上执行操作(异步执行)

//1 2 中添加依赖 那么2 是提前执行

    [operation1 addDependency:operation2];

    [queue addOperation:operation1];

    [queue addOperation:operation2];

}


//创建了异步线程 

- (void)loadNSOperationQueue

{

    //使用消息队列封装了线程

    NSOperationQueue *queue =  [[NSOperationQueue alloc] init];

    [queue addOperationWithBlock:^{

        NSLog(@"%@",[NSThread currentThread]);

    }];


    [queue addOperationWithBlock:^{

        NSLog(@"%@",[NSThread currentThread]);

    }];


    [queue addOperationWithBlock:^{

        NSLog(@"%@",[NSThread currentThread]);

    }];


    [queue addOperationWithBlock:^{

        NSLog(@"%@",[NSThread currentThread]);

    }];


    //同时只允许一条线程运行

    [queue setMaxConcurrentOperationCount:1];


    //取消queue中所有的操作

    //[queue cancelAllOperations];


}


//创建了一条线程 方式一  同步的

- (void)loadInvocationOperation

{

   NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];

    NSLog(@"operation%@" ,[NSThread currentThread]);

    //执行完调用的;

    operation.completionBlock = ^(){

        NSLog(@"执行完毕");

    };

    //开启线程

    [operation start];

}


//取消操作

//[operation cancel];


//创建了一条线程 方式一

- (void)loadBlockOperation

{

  NSBlockOperation *block = [NSBlockOperation

                             blockOperationWithBlock:^(){

      NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);

  }];

    //封装数据操作

    [block addExecutionBlock:^(){

        NSLog(@"YOU执行第1次操作,线程:%@", [NSThread currentThread]);

     }];

    [block addExecutionBlock:^(){

        NSLog(@"YOU执行第1次操作,线程:%@", [NSThread currentThread]);

     }];

     [block addExecutionBlock:^(){

        NSLog(@"YOU执行第1次操作,线程:%@", [NSThread currentThread]);

     }];

    //开启线程

    [block start];

   }


- (void)run

{

    NSLog(@"run%@",[NSThread currentThread]);

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值