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

来源:互联网 发布:赵薇事件 知乎 编辑:程序博客网 时间:2024/06/16 11:10

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

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

 2 然后将NSOperation对象添加到NSOperationQueue

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


 NSOperation步骤;

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

 1> NSInvocationOperation

 2> NSBlockOperation

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


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


- (void)viewDidLoad

{

    [superviewDidLoad];

    

    [selfloadOperation];

}


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

- (void)loadOperation

{

  NSOperationQueue *queue = [[NSOperationQueuealloc] init];

    

    NSBlockOperation *operation1 =  [NSBlockOperationblockOperationWithBlock:^{

        NSLog(@"operation1%@",[NSThreadcurrentThread]);

    }];

    NSBlockOperation *operation2 =  [NSBlockOperationblockOperationWithBlock:^{

        NSLog(@"operation2%@",[NSThreadcurrentThread]);

    }];

  

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

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

    [operation1addDependency:operation2];

    [queueaddOperation:operation1];

    [queueaddOperation:operation2];

}


//创建了异步线程 

- (void)loadNSOperationQueue

{

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

    NSOperationQueue *queue =  [[NSOperationQueuealloc] init];

    [queue addOperationWithBlock:^{

        NSLog(@"%@",[NSThreadcurrentThread]);

    }];


    [queue addOperationWithBlock:^{

        NSLog(@"%@",[NSThreadcurrentThread]);

    }];


    [queue addOperationWithBlock:^{

        NSLog(@"%@",[NSThreadcurrentThread]);

    }];


    [queue addOperationWithBlock:^{

        NSLog(@"%@",[NSThreadcurrentThread]);

    }];


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

    [queue setMaxConcurrentOperationCount:1];


    //取消queue中所有的操作

    //[queue cancelAllOperations];


}


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

- (void)loadInvocationOperation

{

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

    NSLog(@"operation%@" ,[NSThreadcurrentThread]);

    //执行完调用的;

    operation.completionBlock = ^(){

       NSLog(@"执行完毕");

    };

    //开启线程

    [operationstart];

}


//取消操作

//[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]);

     }];

     [blockaddExecutionBlock:^(){

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

     }];

    //开启线程

    [blockstart];

   }


- (void)run

{

    NSLog(@"run%@",[NSThreadcurrentThread]);

}



原创粉丝点击