NSOperation和GCD一样,不用我们管理线程的生命周期,加锁等问题,只要把操作封装进NSOperation中,系统会自动帮我们创建线程,执行操作。而且他是面向对象的,我们看起来更容易理解,使用起来也更灵活。GCD提供的API都是C语言的,看起来确实有点头痛。
  NSOperation是一个抽象类,我们得使用他的两个子类NSInvocationOperation和NSBlockOperatio才能实现多线程,当然我们也可以自定义。那下面就先介绍一下该怎么使用。

NSInvocationOperation

代码

- (void)viewDidLoad {[super viewDidLoad];// 初始化一个对象,并把操作(相当于GCD里的任务)封装进去NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];// 开始执行 一开始就执行run方法[operation start];NSLog(@"怎么才执行我");
}
- (void)run {[NSThread sleepForTimeInterval:1.0];NSLog(@"执行操作%@",[NSThread currentThread]);
}

日志

2016-11-06 08:23:38.999 TTTTTTTTTT[2872:38936] 执行操作<NSThread: 0x7a710ca0>{number = 1, name = main}
2016-11-06 08:23:38.999 TTTTTTTTTT[2872:38936] 怎么才执行我

分析:
(1)操作默认在主线程中执行,看打印的第一条日志。
(2)是同步执行的,会堵塞当前线程,看第二条日志,run方法执行完,“怎么才执行我”才打印。

NSBlockOperation

代码

- (void)viewDidLoad {[super viewDidLoad];// 初始化,并把要执行的操作封装进block中NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{[NSThread sleepForTimeInterval:1.0];NSLog(@"执行操作%@",[NSThread currentThread]);}];[operation start];NSLog(@"我知道我想早点执行,那是不可能的");
}

日志

2016-11-06 08:39:16.815 TTTTTTTTTT[3528:48184] 执行操作<NSThread: 0x60800006e4c0>{number = 1, name = main}
2016-11-06 08:39:16.816 TTTTTTTTTT[3528:48184] 我知道我想早点执行,那是不可能的

分析:是不是看起来和NSInvocationOperation一样,都是同步在主线程中执行,其实NSBlockOperation是可以并发执行的;

NSBlockOperation的并发执行

代码

- (void)viewDidLoad {[super viewDidLoad];// 初始化,并把要执行的操作封装进block中NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{// 添加任务ANSLog(@"执行操作A%@",[NSThread currentThread]);}];[operation addExecutionBlock:^{// 添加任务BNSLog(@"执行操作B%@",[NSThread currentThread]);}];[operation addExecutionBlock:^{// 添加任务CNSLog(@"执行操作C%@",[NSThread currentThread]);}];[operation start];}

日志

2016-11-06 08:43:48.102 TTTTTTTTTT[3707:50733] 执行操作B<NSThread: 0x60000007f200>{number = 3, name = (null)}
2016-11-06 08:43:48.102 TTTTTTTTTT[3707:50702] 执行操作A<NSThread: 0x60000007cac0>{number = 1, name = main}
2016-11-06 08:43:48.102 TTTTTTTTTT[3707:50734] 执行操作C<NSThread: 0x608000268840>{number = 4, name = (null)}

分析:
(1)看到没有,操作B和C都是在子线程执行的,实现了异步并发。
(2)当NSBlockOperation里的要执行的操作的数量 >1的时,就会异步并发执行;否则(当NSBlockOperation里的要执行的操作只有一个),就会默认在主线程中同步执行。

NSOperationQueue

   NSInvocationOperation里面的操作也想异步并发执行可以不可以呢?当然没问题了,用NSOperationQueue 就行。
代码

- (void)viewDidLoad {[super viewDidLoad];// 初始化一个NSOperationQueue对象NSOperationQueue *queue= [NSOperationQueue new];NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run1) object:nil];// 添加操作[queue addOperation:operation1];NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run2) object:nil];// 添加操作[queue addOperation:operation2];// 还可以这样添加操作[queue addOperationWithBlock:^{NSLog(@"执行第3个操作%@",[NSThread currentThread]);}];
}
- (void)run1 {NSLog(@"执行第1个操作%@",[NSThread currentThread]);
}- (void)run2 {NSLog(@"执行第2个操作%@",[NSThread currentThread]);
}

日志

2016-11-06 08:57:03.498 TTTTTTTTTT[4195:57383] 执行第2个操作<NSThread: 0x60800006f8c0>{number = 3, name = (null)}
2016-11-06 08:57:03.498 TTTTTTTTTT[4195:57384] 执行第1个操作<NSThread: 0x608000079480>{number = 4, name = (null)}
2016-11-06 08:57:03.498 TTTTTTTTTT[4195:57386] 执行第3个操作<NSThread: 0x600000079e40>{number = 5, name = (null)}

分析:
(1)三个操作分别在不同的线程中执行,实现了并发。
(2)添加进队列的任务会自动执行,不要我们开启了。
[operation start];不用写了。
(3)添加进队列的任务也是遵循先进先出的FIFO准则。那有人就要问了,为什么第一个操作不是第一个先执行完?这其实和100米赛跑一个起跑的不是第一个到终点一个道理,不矛盾。

总结

  NSOperation的使用步骤和GCD没啥区别,都是确定要执行的操作,把操作放进NSOperation中,开始执行。如果想异步并发操作,在加一步,把NSOperation放进队列中。记住一点不能直接使用NSOperation,要使用它的两个子类NSInvocationOperation和NSBlockOperatio。
  其实关于NSOperation还有很多基本的属性和方法,下一篇文章再讲。看到NSOperation的使用是不是舒服多了……

转载于:https://www.cnblogs.com/doujiangyoutiao/p/6034734.html

iOS多线程之7.NSOperation的初识相关推荐

  1. iOS多线程之GCD小记

    iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...

  2. (五十六)iOS多线程之NSOperation

    NSOpertation是一套OC的API,是对GCD进行的Cocoa抽象. NSOperation有两种不同类型的队列,主队列和自定义队列. 主队列运行于主线程上,自定义队列在后台运行. [NSBl ...

  3. (五十五)iOS多线程之GCD

    GCD的全称为Grand Central Dispatch,翻译为大中央调度,是Apple开发的一个多线程编程解决方法. 进程和线程的概念: 正在进行中的程序被称为进程,负责程序运行的内存分配,每一个 ...

  4. IOS多线程之Block编程

    1 什么是block iOS SDK 4.0開始,Apple引入了block这一特性.字面上说,block就是一个代码块.可是它的奇妙之处在于在内联(inline)运行的时候(这和C++非常像)还能够 ...

  5. ios多线程之NSThread头文件详解

    1.NSThread 头文件中的相关方法 //获取当前线程+(NSThread *)currentThread; //创建线程后自动启动线程 + (void)detachNewThreadSelect ...

  6. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

  7. 多线程之NSThread

    关于多线程会有一系列如下: 多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD ...

  8. iOS多线程编程之NSThread的使用(★★★推荐,为原作者点赞★★★)

    文章来源:http://blog.csdn.net/totogo2010/article/details/8010231 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThre ...

  9. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

最新文章

  1. 这群人学做AI架构师,目标却是让人们感知不到AI的存在
  2. JS获取字符串实际长度(包含汉字)的简单方法
  3. 自动驾驶汽车的未来,“锂电池先驱”:需要更强劲的电池
  4. 输出联系变化的数字seq
  5. 浏览器输入域名网址访问后的过程详解
  6. python的flag是什么意思_网上老说的flag是什么意思
  7. Event Recommendation Engine Challenge分步解析第五步
  8. Maven构建分布式项目时子模块相互依赖打包技巧
  9. Dockerfile 常用命令
  10. DKIM标准:对付网络钓鱼的新武器
  11. 联想如何安装linux系统安装步骤,加速本本的启动 - 在ThinkPad上安装Ubuntu的全过程详解_Linux教程_Linux公社-Linux系统门户网站...
  12. c语言机器人编程软件,诺宝rc编程软件下载
  13. 腾讯再投500亿元资金助力共同富裕;数学家将π计算到62.8万亿位;Go 1.17正式发布|极客头条...
  14. P2030 - 【BJOI2006】狼抓兔子
  15. C++ 之父即将开始直播,请就位!
  16. python不能复制粘贴_你知道怎么使用python实现复制粘贴的功能吗?
  17. DLUTOJ 1033 Matrix
  18. 【狂神说Redis】2Redis入门 2-4 Redis基础知识
  19. 通过slave_exec_mode=IDEMPOTENT跳过主从复制中的错误
  20. 董宝珍:从股市总市值占GDP比例看本轮牛市的归宿

热门文章

  1. 复制查到到的文件到另一个目录(shell脚本)
  2. 40岁后才明白的道理:人一生奋斗余地很有限--转载
  3. 第八届全球游戏大会(GMGC北京2019)
  4. vue eventBus 跳坑的办法
  5. Java并发编程之CAS
  6. java的观察者模式
  7. 2017 计蒜之道 初赛 第五场 B. UCloud 的安全秘钥(简单)
  8. 10大常见的安全漏洞!你知道吗?
  9. Typescript 其实就想排个序和枚举取数
  10. Eclipse打包工具 FatJAR