1.最大并发数:

- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = ;
注:系统一般会根据内存大小自动设置并发数目,也可以自己设定,但是不要乱设,一般不要超过5个。
 
2.暂停和取消

(1)取消队列的所有操作

- (void)cancelAllOperations;

提⽰:也可以调用NSOperation的- (void)cancel⽅法取消单个操作

(2)暂停和恢复队列

- (void)setSuspended:(BOOL)b; // YES代表暂停队列,NO代表恢复队列

- (BOOL)isSuspended; //当前状态

3.操作优先级 : 设置NSOPeration的优先级,可以改变在NSOPerationQueue中的执行优先级

    [operation2 setQueuePriority:NSOperationQueuePriorityNormal];  //设置优先级
NSOperationQueuePriority priority = operation2.queuePriority; //获去操作的优先级

4.操作依赖

  有两个操作,operationA:买饭和operationB:吃饭,必须要先买饭,然后再吃饭。操作B:吃饭 必须等到操作A:买饭 的操作完成后才能执行。这就是依赖关系。

  在NSOPeration中描述依赖用:[operationB addDependency:operationA];

- (void)viewDidLoad {
[super viewDidLoad];
NSInvocationOperation *operationA = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(testAction) object:nil]; NSInvocationOperation *operationB = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(testAction1) object:nil]; [operationB addDependency:operationA];
//定义队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//将操作添加到队列
[queue addOperation:operationA];
[queue addOperation:operationB]; } -(void)testAction
{
for (int i = ; i < ; i ++) {
NSLog(@"给五个人买饭带回宿舍----%@",[NSThread currentThread]);
}
} -(void)testAction1
{
for (int i = ; i < ; i ++) {
NSLog(@"五个人开始吃饭----%@",[NSThread currentThread]);
}
}

2017-06-18 11:33:26.765 demo[17639:3076261] 给五个人买饭带回宿舍----<NSThread: 0x600000267b40>{number = 3, name = (null)}

2017-06-18 11:33:26.766 demo[17639:3076261] 给五个人买饭带回宿舍----<NSThread: 0x600000267b40>{number = 3, name = (null)}

2017-06-18 11:33:26.767 demo[17639:3076261] 给五个人买饭带回宿舍----<NSThread: 0x600000267b40>{number = 3, name = (null)}

2017-06-18 11:33:26.768 demo[17639:3076261] 给五个人买饭带回宿舍----<NSThread: 0x600000267b40>{number = 3, name = (null)}

2017-06-18 11:33:26.769 demo[17639:3076261] 给五个人买饭带回宿舍----<NSThread: 0x600000267b40>{number = 3, name = (null)}

2017-06-18 11:33:26.770 demo[17639:3076261] 五个人开始吃饭----<NSThread: 0x600000267b40>{number = 3, name = (null)}

2017-06-18 11:33:26.776 demo[17639:3076261] 五个人开始吃饭----<NSThread: 0x600000267b40>{number = 3, name = (null)}

2017-06-18 11:33:26.777 demo[17639:3076261] 五个人开始吃饭----<NSThread: 0x600000267b40>{number = 3, name = (null)}

2017-06-18 11:33:26.781 demo[17639:3076261] 五个人开始吃饭----<NSThread: 0x600000267b40>{number = 3, name = (null)}

2017-06-18 11:33:26.782 demo[17639:3076261] 五个人开始吃饭----<NSThread: 0x600000267b40>{number = 3, name = (null)}

 注:用for循环更能看出操作的执行顺序。

5.操作的监听

有时候需要执行完一个操作再执行另个操作,可以将这两个操作写在一起,但是当代码很多的时候,会造成阅读性不强。

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
for (int i = ; i < ; i ++) {
NSLog(@"给五个人买饭带回宿舍----%@",[NSThread currentThread]);
} for (int i = ; i < ; i ++) {
NSLog(@"五个人开始吃饭----%@",[NSThread currentThread]);
}
}]; //定义队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//将操作添加到队列
[queue addOperation:operation];

也可以分开写:

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
for (int i = ; i < ; i ++) {
NSLog(@"给五个人买饭带回宿舍----%@",[NSThread currentThread]);
}
}];
operation.completionBlock = ^{
for (int i = ; i < ; i ++) {
NSLog(@"五个人开始吃饭----%@",[NSThread currentThread]);
}
}; //定义队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//将操作添加到队列
[queue addOperation:operation];

2017-06-18 11:41:21.883 demo[17675:3084893] 给五个人买饭带回宿舍----<NSThread: 0x600000071200>{number = 3, name = (null)}

2017-06-18 11:41:21.885 demo[17675:3084893] 给五个人买饭带回宿舍----<NSThread: 0x600000071200>{number = 3, name = (null)}

2017-06-18 11:41:21.886 demo[17675:3084893] 给五个人买饭带回宿舍----<NSThread: 0x600000071200>{number = 3, name = (null)}

2017-06-18 11:41:21.888 demo[17675:3084893] 给五个人买饭带回宿舍----<NSThread: 0x600000071200>{number = 3, name = (null)}

2017-06-18 11:41:21.888 demo[17675:3084893] 给五个人买饭带回宿舍----<NSThread: 0x600000071200>{number = 3, name = (null)}

2017-06-18 11:41:21.894 demo[17675:3084895] 五个人开始吃饭----<NSThread: 0x60800006c600>{number = 4, name = (null)}

2017-06-18 11:41:21.895 demo[17675:3084895] 五个人开始吃饭----<NSThread: 0x60800006c600>{number = 4, name = (null)}

2017-06-18 11:41:21.896 demo[17675:3084895] 五个人开始吃饭----<NSThread: 0x60800006c600>{number = 4, name = (null)}

2017-06-18 11:41:21.897 demo[17675:3084895] 五个人开始吃饭----<NSThread: 0x60800006c600>{number = 4, name = (null)}

2017-06-18 11:41:21.898 demo[17675:3084895] 五个人开始吃饭----<NSThread: 0x60800006c600>{number = 4, name = (null)}

注:可以看出当买饭的操作完成后,开启一个新线程执行吃饭操作。 

 
 

iOS多线程---NSOperation的常用操作的更多相关文章

  1. iOS 多线程 NSOperation、NSOperationQueue

    1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...

  2. iOS开发:UINavigationController常用操作

    NavigationController常用操作: 更改bar的背景颜色:self.navigationController?.navigationBar.barTintColor =UIColor. ...

  3. iOS多线程 NSOperation的用法

    上一篇写了 GCD 的使用,接下来就了解一下 NSOperation ,NSOperation是苹果对 GCD 的 OC 版的一个封装,但是相对于GCD来说可控性更强,并且可以加入操作依赖. NSOp ...

  4. ios多线程开发的常用三种方式

    1.NSThread 2.NSOperationQueue 3.GCD NSThread: 创建方式主要有两种: [NSThread detachNewThreadSelector:@selector ...

  5. iOS多线程--NSOperation 浅显易懂

    NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...

  6. iOS多线程--NSOperation

    NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...

  7. iOS多线程---NSOperation介绍和使用

    1.  NSOperation实现多线程编程,需要和NSOperationQueue一起使用. (1)先将要执行的操作封装到NSOperation中 (2)将NSOperation对象添加到NSOpe ...

  8. IOS 多线程 NSOperation GCD

    1.NSInvocationOperation NSInvocationOperation * op; NSOperationQueue * que = [[NSOperationQueuealloc ...

  9. iOS开发NSOperation 三:操作依赖和监听以及线程间通信

    一:操作依赖和监听 #import "ViewController.h" @interface ViewController () @end @implementation Vie ...

随机推荐

  1. c++11多线程学习笔记之三 condition_variable使用

    从windows角度来说,condition_variable类似event. 阻塞等待出发,不过condition_variable可以批量出发. 代码如下: // 1111111.cpp : 定义 ...

  2. how to enable the Accessibility in the app

    第一部分 先要装一个accchecker,全称是 UI Accessibility Checker .下载地址: http://acccheck.codeplex.com/ 装了之后 用这个工具可以 ...

  3. const stirng* 类型的指针cp,当cout<<*cp<<endl:会提示没有与之匹配的“<<”运算符

    #include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> usin ...

  4. 小程序getUserInfo授权升级更新登录优化

    小程序基础库2.0.7更新小程序组件 <button> 新增 open-type 属性有效值 openSetting,所以说,再也不能愉快的直接调用getUserInfo了.但是不想用官方 ...

  5. 2018.09.26 bzoj5221: [Lydsy2017省队十连测]偏题(数学推导+矩阵快速幂)

    传送门 由于没有考虑n<=1的情况T了很久啊. 这题很有意思啊. 考试的时候根本不会,骗了30分走人. 实际上变一个形就可以了. 推导过程有点繁杂. 直接粘题解上的请谅解. 不得不说这个推导很妙 ...

  6. 2018.09.14 codechef Milestone(随机化算法)

    传送门 由于存在不超过7条直线可以覆盖超过所有的点. 所以如果我们随机选点的话(每次随机两个) 那么得到的解恰好为最优解的概率是149" role="presentation&qu ...

  7. 第八章 连词(Les conjonction )

    ★并列连词(La conjonction de coordination ) ()表示联合关系的并列连词 .et连接肯定的内容.如:    ➞Il conduit vite et bien.      ...

  8. Linux服务器部署系列之七—OpenLDAP篇

    LDAP(轻量级目录访问服务),通过配置这个服务,我们也可以在linux下面使用目录的形式管理用户,就像windows下面的AD一样,方便我们管理.下面我们就一起来配置openldap服务.本文运行环 ...

  9. Tensorflow从源代码编译2

    https://blog.csdn.net/qq_37674858/article/details/81095101 https://blog.csdn.net/yhily2008/article/d ...

  10. (线段树) Count the Colors --ZOJ --1610

    链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82832#problem/F http://acm.zju.edu.cn/onli ...