iOS多线程-03-NSOperation与NSOperationQueue
简介
- 通过NSOperation与NSOperationQueue的组合也能实现多线程
- 通常将任务封装成NSOperation对象,并将对象添加到NSOperationQueue中实现
NSOperation
NSOperation是一个抽象类,不能用来直接封装操作,通常使用它的子类来封装操作
若不将NSOperation对象添加到NSOperationQueue中,操作只会在当前线程执行,且需要手动开始执行操作
NSoperation的子类
NSInvocationOperation
//创建操作
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
//开始执行操作
[operation start];
NSBlockOperation(当操作数大于1时,异步执行)
//创建操作
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
//操作封装的任务代码
}];
//添加操作
[operation addExecutionBlock:^{
//操作封装的任务代码
}];
//开始执行操作
[operation start];
自定义子类的步骤
- 重写- (void)main方法,在该方法中封装需要执行的操作
- 在- (void)main方法中,需要自己建立自动释放池(原因:若是异步操作,无法访问主线程的自动释放池)
- 通过检查cancelled等属性,来判断操作的状态,执行相应的操作
设置操作完成时的回调
//创建操作
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
//任务代码
}];
//设置回调
operation.completionBlock = ^{
//操作完成时执行的代码
};
NSOperationQueue
- 作用
- 容纳需要异步执行的操作
- 系统会自动执行NSOperationQueue中的操作,不需要手动启动
- NSOperationQueue的相关操作
- 创建操作队列
- [[NSOperationQueue alloc] init]
- 获取主操作队列
- + (NSOperationQueue *)mainQueue
- 获取当前操作队列
- + (nullable NSOperationQueue *)currentQueue
- 往队列中添加操作
- - (void)addOperation:(NSOperation *)op
- - (void)addOperationWithBlock:(void (^)(void))block
- 设置最大并发操作数
- - setMaxConcurrentOperationCount:(NSInteger)count
- 若并发操作数为1,则为串行队列
- 暂停/启动队列中的任务
- - setSuspended:(BOOL)b
- 取消队列中的任务
- - (void)cancelAllOperations
- 等到正在执行的任务执行完毕,队列才会被挂起
- 创建操作队列
实现多线程的步骤
创建操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]
往队列中添加操作
/**
方法一
*/
//创建操作
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil] //download为操作封装的任务方法
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
//任务代码
}];
//添加操作
[queue addOperation:operation1];
[queue addOperation:operation2]; /**
方法二
*/
//添加操作
[queue addOperationWithBlock:^{
//操作封装的任务
}];
操作依赖
- 作用
- 建立操作之间的执行顺序关系
- 操作依赖是面向操作的,可以跨队列建立操作之间的依赖关系
- 若要建立操作之间的依赖关系,必须在操作被添加到队列之前建立
- 建立操作依赖的步骤
创建操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]
添加操作
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
//任务1代码
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
//任务2代码
}];
建立依赖关系(必须在操作被添加到队列之前)
[operation1 addDependency:operation2];
将操作添加到队列
[queue addOperation:operation1];
[queue addOperation:operation2];
线程之间的通信
- 从主线程到子线程
- 从主线程到子线程的切换,通常是系统自动完成的,只需要将操作添加到队列中,系统就会根据实际需要,是否切换到子线程中执行操作
- 从子线程到主线程
将需要执行的操作,添加到主操作队列中即可(该操作将运行在主runLoop的common模式下)
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//需要在主线程中执行的任务代码
}];
iOS多线程-03-NSOperation与NSOperationQueue的更多相关文章
- IOS多线程(NSOperation,NSOperationQueue)
含义:NSOperation,NSOperationQueue是什么. The NSOperation class is an abstract class you use to encapsulat ...
- iOS自学之NSOperation、NSOperationQueue、Background
iOS中多线程编程主要分为NSThread.NSOperation和GCD,今天主要记录下自己在学习NSOperation中的点滴-如有不对的地方帮忙指出下,PS:人生第一次写blog,各位看官请轻虐 ...
- iOS多线程编程--NSOperation(转)
这篇文章写得非常不错,基础用法都涉及到了,我把文章提到的例子都写到了demo里面, 原文地址: iOS多线程--彻底学会多线程之『NSOperation』 demo下载:https://github. ...
- iOS 多线程之 NSOperation 的基本使用
1.NSOperation,NSOperationQueue 简介 NSOperation,NSOperationQueue是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.NSO ...
- iOS开发多线程篇—NSOperation简单介绍
iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...
- iOS-----使用NSOperation与NSOperationQueue实现多线程
使用NSOperation与NSOperationQueue实现多线程 NSOperation与NSOperationQueue的基本理论如下. NSOperationQueue 代表一个FIFO的队 ...
- iOS开发——多线程篇——NSOperation(基于GCD多线程编程),下载图片并合成新图片
一.NSOperation的基本概念1.简介NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...
- [iOS 多线程 & 网络 - 1.3] - NSOperation
A.NSOperation的基本使用 1.NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...
- iOS多线程编程之NSOperation的基本操作(转载)
一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperat ...
- iOS多线程与网络开发之NSOperation
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...
随机推荐
- 【HTML】iframe跨域访问问题
概述 本地同一浏览器访问本地HTML文件和访问服务器端HTML文件,本地Iframe没有自适应高度,而服务器端的Ifrane自适应了高度. 1.问题重现: Chrome 版本 41.0.2272.10 ...
- centos 一键安装jdk
先检查 yum list installed |grep java 卸载JDK相关文件输入:yum -y remove java-1.7.0-openjdk*. 卸载tzdata-java输入:yum ...
- Spring Remoting: Burlap--转
原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-burlap.jsp Concept Overview In the ...
- Android学习笔记(第一篇)编写第一个程序Hello World+Activity
PS:终于开始正式的搞Android了...无人带的一介菜鸟,我还是自己默默的努力吧... 学习内容: 1.编写第一个Hello World程序.. 学习Android,那么就需要有一个编译器来集 ...
- Microsoft OneScript 团队发布的最新一版在 SQL Server Management Studio 中运行的脚本,可以帮助我们获取更详细的版本信息。
该脚本有以下几点: 1. SQL Server 的主要版本.服务级别和版本类别 2. 已安装SP包.累计更新CU,历史更新的QFE\ GDR 3. 推荐当前SP包可以安装最新的CU,并给到相关资源地地 ...
- sql server service broker中调用存储过程执行跨库操作,不管怎么设置都一直提示 服务器主体 "sa" 无法在当前安全上下文下访问数据库 "dbname"。
用sql server自带的消息队列service borker,调用存储过程中,执行了一个跨库的操作,先是用了一个用户,权限什么都给够了,但是一直提示 服务器主体 "user" ...
- mysql批量生成修改表和列注释语句
当我们在一个数据库修改完备注后,需要将其导致另一个服务器上的数据库中,需要生成批量执行语句,方便操作,注意用change 或modified 进行列的属性修改时,没有写全的话会造成其它属性的丢失,如 ...
- IOS 之 PJSIP 笔记(一) 编译多平台支持的静态库
好久没有写博客了,这也算是我步入新工作后的第一篇技术博文吧.在进入新公司前,早就有了技术层进入下一个迭代的准备,但很多事情是意想不到的,就像我以 C# 程序员的身份面试入职的,而今却是一个全职的 IO ...
- 使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解
SQLite数据库作为一般单机版软件的数据库,是非常优秀的,我目前单机版的软件产品线基本上全部替换Access作为优选的数据库了,在开发过程中,有时候需要批量写入数据的情况,发现传统的插入数据模式非常 ...
- Winform开发的界面处理优化
在Winform开发中,客户体验是个很好的参考性指标,如果一个功能使用的时候感觉很流畅,说明我们的程序执行效率还不错,但是随着数据的真多,原先可能流程的地方可能会变得比较卡,这时候就需要追本索源,找到 ...