iOS多线程之7.NSOperation的初识
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:^{
// 添加任务A
NSLog(@"执行操作A%@",[NSThread currentThread]);
}];
[operation addExecutionBlock:^{
// 添加任务B
NSLog(@"执行操作B%@",[NSThread currentThread]);
}];
[operation addExecutionBlock:^{
// 添加任务C
NSLog(@"执行操作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的使用是不是舒服多了……
iOS多线程之7.NSOperation的初识的更多相关文章
- iOS多线程之8.NSOPeration的其他用法
本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...
- iOS多线程之GCD小记
iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...
- iOS多线程之Thread
多线程 • Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周 ...
- iOS多线程之GCD、OperationQueue 对比和实践记录
[toc] 简介 在计算的早期,计算机可以执行的最大工作量是由 CPU 的时钟速度决定的.但是随着技术的进步和处理器设计的紧凑化,热量和其他物理约束开始限制处理器的最大时钟速度.因此,芯片制 ...
- iOS多线程之NSOperation详解
使用NSOperation和NSOperationQueue进行多线程开发,只要将一个NSOperation(实际开发中需要使用其子类 NSInvocationOperation,NSBlockOpe ...
- iOS 多线程之NSOperation篇举例详解
这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇.总篇也包含了此文的链接.本文讲解的知识点有NSBlockOperationClick,队列, ...
- iOS多线程之9.自定义NSOperation
本文主要讲如何自定义NSOperation,以及自定义NSOperation的一些注意事项,以下载图片为例. 新建一个类,继承于NSOperation. CustomOperation.h 代码 ...
- IOS多线程之NSOperation学习总结
NSOperation简介 1.NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 2.NSOperation和NSOperationQu ...
- iOS多线程之NSOperation,NSOperationQueue
使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也 ...
随机推荐
- 【初探Spring】------Spring IOC(一)
IOC:Inversion of Control(控制反转).IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想.IOC的核心思想就体现在控制.反转这两个词上面,要理 ...
- ASP.NET MVC 描述类型(二)
ASP.NET MVC 描述类型(二) 前言 上个篇幅中说到ControllerDescriptor类型的由来过程,对于ControllerDescriptor类型来言ActionDescriptor ...
- 使用 Code Snippet 简化 Coding
在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符一个字符敲还是使用 Visual Studio 提 ...
- 数据库中树形列表(以easyui的tree为例)
构造一棵easyui前台框架的一个树形列表为例后台框架是spring MVC+JPA. 先看一下数据库是怎么建的,怎么存放的数据 下面是实体类 /** * 部门类 用户所属部门(这里的部门是一个相对抽 ...
- java注意的一些细节问题
1. 大括弧作用域问题 public static void main(String[] args) { { int x; { int x;//编译错误:Duplicate local variabl ...
- K-Means聚类算法原理
K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体 ...
- 搞定.NET MVC IOC控制反转,依赖注入
一直听说IOC,但是一直没接触过,只看例子好像很高达上的样子,今天抽了点时间实现了下,当然也是借助博客园里面很多前辈的文章来搞的!现在做个笔记,防止自己以后忘记! 1.首先创建MVC项目 2.然后新建 ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)
上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...
- mssql 字增自段怎样重置(重新自增)|清空表已有数据
方法1 -- 清空已有数据,并且将自增自段恢复从1开始计数 truncate table 表名 方法2 -- 不清空已有数据,但将自增自段恢复从1开始计数 dbcc checkident(表名,RES ...
- [JSP]JSP 简介
1.1 概述 1.1.1 什么是 JSP? JSP 全称是 Java Server Pages,是一种动态网页开发技术. 它与 PHP.ASP.ASP.NET 等语言类似,运行在服务端的语言. JSP ...