iOS开发多线程篇—NSOperation基本操作
iOS开发多线程篇—NSOperation基本操作
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
(1)取消队列的所有操作
- (void)cancelAllOperations;
提⽰:也可以调用NSOperation的- (void)cancel⽅法取消单个操作
(2)暂停和恢复队列
- (void)setSuspended:(BOOL)b; // YES代表暂停队列,NO代表恢复队列
- (BOOL)isSuspended; //当前状态
(1)设置NSOperation在queue中的优先级,可以改变操作的执⾏优先级
- (NSOperationQueuePriority)queuePriority;
- (void)setQueuePriority:(NSOperationQueuePriority)p;
(2)优先级的取值
NSOperationQueuePriorityVeryLow = -8L,
NSOperationQueuePriorityLow = -4L,
NSOperationQueuePriorityNormal = 0,
NSOperationQueuePriorityHigh = 4,
NSOperationQueuePriorityVeryHigh = 8
说明:优先级高的任务,调用的几率会更大。
(1)NSOperation之间可以设置依赖来保证执行顺序,⽐如一定要让操作A执行完后,才能执行操作B,可以像下面这么写
[operationB addDependency:operationA]; // 操作B依赖于操作
(2)可以在不同queue的NSOperation之间创建依赖关系
注意:不能循环依赖(不能A依赖于B,B又依赖于A)。
(3)代码示例
- #import "YYViewController.h"
- @interface YYViewController ()
- @end
- @implementation YYViewController
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- //创建NSInvocationOperation对象,封装操作
- NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
- NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
- //创建对象,封装操作
- NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
- for (int i=; i<; i++) {
- NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
- }
- }];
- [operation3 addExecutionBlock:^{
- for (int i=; i<; i++) {
- NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
- }
- }];
- //设置操作依赖
- //先执行operation2,再执行operation1,最后执行operation3
- [operation3 addDependency:operation1];
- [operation1 addDependency:operation2];
- //不能是相互依赖
- // [operation3 addDependency:operation1];
- // [operation1 addDependency:operation3];
- //创建NSOperationQueue
- NSOperationQueue * queue=[[NSOperationQueue alloc]init];
- //把操作添加到队列中
- [queue addOperation:operation1];
- [queue addOperation:operation2];
- [queue addOperation:operation3];
- }
- -(void)test1
- {
- for (int i=; i<; i++) {
- NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
- }
- }
- -(void)test2
- {
- for (int i=; i<; i++) {
- NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
- }
- }
- @end

可以监听一个操作的执行完毕
- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;
代码示例
第一种方式:可以直接跟在任务后面编写需要完成的操作,如这里在下载图片后,紧跟着下载第二张图片。但是这种写法有的时候把两个不相关的操作写到了一个代码块中,代码的可阅读性不强。
- #import "YYViewController.h"
- @interface YYViewController ()
- @end
- @implementation YYViewController
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- //创建对象,封装操作
- NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"-operation-下载图片-%@",[NSThread currentThread]);
- //.....下载图片后继续进行的操作
- NSLog(@"--接着下载第二张图片--");
- }];
- //创建队列
- NSOperationQueue *queue=[[NSOperationQueue alloc]init];
- //把任务添加到队列中(自动执行,自动开线程)
- [queue addOperation:operation];
- }
- @end
第二种方式:
- #import "YYViewController.h"
- @interface YYViewController ()
- @end
- @implementation YYViewController
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- //创建对象,封装操作
- NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
- for (int i=; i<; i++) {
- NSLog(@"-operation-下载图片-%@",[NSThread currentThread]);
- }
- }];
- //监听操作的执行完毕
- operation.completionBlock=^{
- //.....下载图片后继续进行的操作
- NSLog(@"--接着下载第二张图片--");
- };
- //创建队列
- NSOperationQueue *queue=[[NSOperationQueue alloc]init];
- //把任务添加到队列中(自动执行,自动开线程)
- [queue addOperation:operation];
- }
- @end
打印查看:
说明:在上一个任务执行完后,会执行operation.completionBlock=^{}代码段,且是在当前线程执行(2)。
iOS开发多线程篇—NSOperation基本操作的更多相关文章
- iOS开发多线程篇—NSOperation简单介绍
iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...
- iOS开发——多线程篇——NSOperation(基于GCD多线程编程),下载图片并合成新图片
一.NSOperation的基本概念1.简介NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...
- iOS开发多线程篇 10 —NSOperation基本操作
iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...
- iOS开发多线程篇 09 —NSOperation简单介绍
iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...
- iOS开发多线程篇—自定义NSOperation
iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS开发多线程篇 11 —自定义NSOperation
iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS开发多线程篇—多线程简单介绍
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS开发多线程篇—线程安全
iOS开发多线程篇—线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块 ...
- iOS 开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
随机推荐
- Leetcode: Assign Cookies
Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...
- js作用域学习
代码解析至少分两步 1):查找var,function参数例如下面这个例子 a= 未定义 fn1={alert(2)}函数的话,是整个整体 2):逐行读代码:类似=+-%*等都是表达式,表达式可以改变 ...
- STL之容器(1)
STL容器类的模板 容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和 ...
- PHP二维数组提取函数----把不需要的数据剔除
首先说明一些这个函数的应用场景,比如说你得到的数据是个二维数组,里面的很多成员其实是不必要的,比如说api调用后不必要给别人返回一些用不到的垃圾数据吧,如下是代码. <?php /* * del ...
- tomcat部署https
在server.xml配置文件中增加证书位置跟密码: <Connector port="443" protocol="org.apache.coyote.http1 ...
- Git入门教程
参考文献: 1. Pro Git 2. Git教程 3. Git教程 4. 图解Git
- RecyclerView使用总结
遇到的异常: java.lang.ExceptionInInitializerError静态块初始化异常 NetworkOnMainThreadException访问网线不能在主线程中进行 我的参考资 ...
- FusionCharts或其它flash的div图层总是浮在最上层的问题
div的图层由div的style中的z-index来决定,z-index是层垂直屏幕的坐标,0最小,越大的话位置越靠上. 由于FusionCharts的图表都放在div中,如果页面还有其他的div,将 ...
- 20个Linux服务器安全强化建议(二)
接上文,继续介绍一些Linux服务器的安全配置. #6.强密码策略. 当我们使用 useradd.usermod 命令创建或维护用户账号时,确保始终应用强密码策略.例如,一个好的密码至少包括8个字 ...
- Codeforces Round #316 (Div. 2) D. Tree Requests dfs序
D. Tree Requests time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...