一、NSOperation简介

  1.NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程

    NSOperation和NSOperationQueue实现多线程的具体步骤:

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

    (2)然后将NSOperation对象添加到NSOperationQueue中

    (3)系统会⾃动将NSOperationQueue中的NSOperation取出来

    (4)将取出的NSOperation封装的操作放到⼀条新线程中执⾏

  2.NSOperation的子类

    NSOperation是个抽象类,并不具备封装操作的能力,必须使⽤它的子类

    使用NSOperation⼦类的方式有3种:

      (1)NSInvocationOperation

      (2)NSBlockOperation

      (3)自定义子类继承NSOperation,实现内部相应的⽅法

二、 具体说明

  1.NSInvocationOperation子类

创建对象和执行操作:

  1. 1 //创建操作对象,封装要执行的任务
  2. 2 //NSInvocationOperation 封装操作
  3. 3 NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
  4. 4
  5. 5 //执行操作
  6. 6 [operation start];
  7.  
  8. 说明:一旦执⾏操作,就会调用targettest方法
  1. 8 代码示例:
  2. 9 #import "YYViewController.h"
  3. 10
  4. 11 @interface YYViewController ()
  5. 12
  6. 13 @end
  7. 14
  8. 15 @implementation YYViewController
  9. 16
  10. 17 - (void)viewDidLoad
  11. 18 {
  12. 19 [super viewDidLoad];
  13. 20
  14. 21 //NSOperation:抽象类,不具备封装功能
  15. 22
  16. 23 //创建操作对象,封装要执行的任务
  17. 24 //NSInvocationOperation 封装操作
  18. 25 NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
  19. 26
  20. 27 //执行操作
  21. 28 [operation start];
  22. 29
  23. 30 }
  24. 31
  25. 32 -(void)test
  26. 33 {
  27. 34
  28. 35 NSLog(@"--test--%@--",[NSThread currentThread]);
  29. 36 }
  30. 37 @end
    打印查看:
      

  注意:操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行。

      只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

  2.NSBlockOperation子类

创建对象和添加操作:

  1. 1 //创建NSBlockOperation操作对象
  2. 2 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
  3. 3 //......
  4. 4 }];
  5. 5
  6. 6 //添加操作
  7. 7 [operation addExecutionBlock:^{
  8. 8 //....
  9. 9 }];

代码1:

  1. 9 #import "YYViewController.h"
  2. 10
  3. 11 @interface YYViewController ()
  4. 12
  5. 13 @end
  6. 14
  7. 15 @implementation YYViewController
  8. 16
  9. 17 - (void)viewDidLoad
  10. 18 {
  11. 19 [super viewDidLoad];
  12. 20
  13. 21 //创建NSBlockOperation操作对象
  14. 22 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
  15. 23 NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
  16. 24 }];
  17. 25
  18. 26
  19. 27 //开启执行操作
  20. 28 [operation start];
  21. 29 }
  22. 30 @end

  打印查看:

  

代码2:

  1. 9 #import "YYViewController.h"
  2. 10
  3. 11 @interface YYViewController ()
  4. 12
  5. 13 @end
  6. 14
  7. 15 @implementation YYViewController
  8. 16
  9. 17 - (void)viewDidLoad
  10. 18 {
  11. 19 [super viewDidLoad];
  12. 20
  13. 21 //创建NSBlockOperation操作对象
  14. 22 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
  15. 23 NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
  16. 24 }];
  17. 25
  18. 26 //添加操作
  19. 27 [operation addExecutionBlock:^{
  20. 28 NSLog(@"NSBlockOperation1------%@",[NSThread currentThread]);
  21. 29 }];
  22. 30
  23. 31 [operation addExecutionBlock:^{
  24. 32 NSLog(@"NSBlockOperation2------%@",[NSThread currentThread]);
  25. 33 }];
  26. 34
  27. 35 //开启执行操作
  28. 36 [operation start];
  29. 37 }
  30. 38 @end

    

    注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作

3.NSOperationQueue

  NSOperationQueue的作⽤:NSOperation可以调⽤start⽅法来执⾏任务,但默认是同步执行的

                如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作

                添加操作到NSOperationQueue中,自动执行操作,自动开启线程

  1. 1 //创建NSOperationQueue
  2. 2 NSOperationQueue * queue=[[NSOperationQueue alloc]init];
  3. 3 //把操作添加到队列中
  4. 4 //第一种方式
  5. 5 [queue addOperation:operation1];
  6. 6 [queue addOperation:operation2];
  7. 7 [queue addOperation:operation3];
  8. 8 //第二种方式
  9. 9 [queue addOperationWithBlock:^{
  10. 10 NSLog(@"NSBlockOperation3--4----%@",[NSThread currentThread]);
  11. 11 }];
  12.  
  13.         - (void)addOperation:(NSOperation *)op;
  14.         - (void)addOperationWithBlock:(void (^)(void))block; 
    代码示例
  1. 9 #import "YYViewController.h"
  2. 10
  3. 11 @interface YYViewController ()
  4. 12
  5. 13 @end
  6. 14
  7. 15 @implementation YYViewController
  8. 16
  9. 17 - (void)viewDidLoad
  10. 18 {
  11. 19 [super viewDidLoad];
  12. 20
  13. 21 //创建NSInvocationOperation对象,封装操作
  14. 22 NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
  15. 23 NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
  16. 24 //创建对象,封装操作
  17. 25 NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
  18. 26 NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
  19. 27 }];
  20. 28 [operation3 addExecutionBlock:^{
  21. 29 NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
  22. 30 }];
  23. 31
  24. 32 //创建NSOperationQueue
  25. 33 NSOperationQueue * queue=[[NSOperationQueue alloc]init];
  26. 34 //把操作添加到队列中
  27. 35 [queue addOperation:operation1];
  28. 36 [queue addOperation:operation2];
  29. 37 [queue addOperation:operation3];
  30. 38 }
  31. 39
  32. 40 -(void)test1
  33. 41 {
  34. 42 NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
  35. 43 }
  36. 44
  37. 45 -(void)test2
  38. 46 {
  39. 47 NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
  40. 48 }
  41. 49
  42. 50 @end

  打印效果:

      

      注意: 系统自动将NSOperationqueue中的NSOperation对象取出,将其封装的操作放到一条新的线程中执行。上面的代码示例中,一共有四个 任务,

          operation1和operation2分别有一个任务,operation3有两个任务。一共四个任务,开启了四条线程。通过任务执行的时间 全部都是273可以看出,

           这些任务是并行执行的。

      提示:队列的取出是有顺序的,与打印结果并不矛盾。这就好比,选手A,BC虽然起跑的顺序是先A,后B,然后C,但是到达终点的顺序却不一定是A,B在前,C在后。
 

下面使用for循环打印,可以更明显的看出任务是并发执行的。

代码示例:

  1. 9 - (void)viewDidLoad
  2. 10 {
  3. 11 [super viewDidLoad];
  4. 12
  5. 13 //创建NSInvocationOperation对象,封装操作
  6. 14 NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
  7. 15 NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
  8. 16 //创建对象,封装操作
  9. 17 NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
  10. 18 for (int i=0; i<5; i++) {
  11. 19 NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
  12. 20 }
  13. 21 }];
  14. 22 [operation3 addExecutionBlock:^{
  15. 23 for (int i=0; i<5; i++) {
  16. 24 NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
  17. 25 }
  18. 26 }];
  19. 27
  20. 28 //创建NSOperationQueue
  21. 29 NSOperationQueue * queue=[[NSOperationQueue alloc]init];
  22. 30 //把操作添加到队列中
  23. 31 [queue addOperation:operation1];
  24. 32 [queue addOperation:operation2];
  25. 33 [queue addOperation:operation3];
  26. 34 }
  27. 35
  28. 36 -(void)test1
  29. 37 {
  30. 38 for (int i=0; i<5; i++) {
  31. 39 NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
  32. 40 }
  33. 41 }
  34. 42
  35. 43 -(void)test2
  36. 44 {
  37. 45 for (int i=0; i<5; i++) {
  38. 46 NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
  39. 47 }
  40. 48 }
  41. 49
  42. 50 @end

    

四:多线程--NSOperation简单介绍的更多相关文章

  1. iOS开发多线程篇—NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  2. iOS开发多线程篇 09 —NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  3. 【iOS开发】NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  4. 多线程02---pThread简单介绍

    1.简单介绍 pthread 是属于 POSIX 多线程开发框架. 它是c语言提供的一个跨平台的多线程解决方式.因为其在iOS编程中,操作比較麻烦.一般不用,这里介绍只作为了解. 2.pthread的 ...

  5. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  6. TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍

    首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...

  7. [QT]简单介绍一下 *.pro、*.pri、*.prf、*.prl等四种文件

    转自:http://blog.csdn.net/dbzhang800/article/details/6348432 简单介绍一下 *.pro.*.pri.*.prf.*.prl等四种文件:干嘛用的, ...

  8. C# 基础知识 (四).C#简单介绍及托管代码

            暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了非常多东西,也学到了非常多东西,也认识到了非常多不足之处!闲暇之余我准备又一次进一步巩固C#相关知识,包含 ...

  9. java多线程(简单介绍)

    简单介绍 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被称为主线程)来 ...

随机推荐

  1. Ubuntu 16.04安装JDK7/JDK8的两种方式

    ubuntu 安装jdk 的两种方式:1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用ppa ...

  2. Triangular Pastures (二维01背包)

    描述Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectang ...

  3. Linux 修改主机名

    1 vi /etc/sysconfig/network 2 vi /etc/hosts 3 hostname xxx 4 Done! 退出重连后生效

  4. 外星联络(bzoj 2251)

    Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息. ...

  5. msp430入门编程36

    msp430中C语言的可移植--面向接口实现

  6. windows 配置 apache的多个站点

    windows 配置apache的多个站点 第一步打开apache的conf/extra/httpd-vhosts.conf,复制<VirtualHost></VirtualHost ...

  7. python学习之-- redis模块操作 HASH

    redis 操作 之 -Hash Hash 操作:hash在内存中的存储格式 name hash n1 ------> k1 -> v1 k2 -> v2 k3 -> v3hs ...

  8. HDU 5695 Gym Class

    拓扑排序. #include<cstdio> #include <iostream> #include<cstring> #include<cmath> ...

  9. [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)

    4722: 由乃 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 360  Solved: 131[Submit][Status][Discuss] D ...

  10. eclipse提速03 - 禁用动画