当前位置: 首页 > news >正文

iOS多线程---NSOperation的常用操作

1.最大并发数:

- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    queue.maxConcurrentOperationCount = 3;

 

注:系统一般会根据内存大小自动设置并发数目,也可以自己设定,但是不要乱设,一般不要超过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  = 0;  i < 5; i ++) {
        NSLog(@"给五个人买饭带回宿舍----%@",[NSThread currentThread]);
    }
}

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

也可以分开写:

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        for (int i  = 0;  i < 5; i ++) {
            NSLog(@"给五个人买饭带回宿舍----%@",[NSThread currentThread]);
        }
    }];
    operation.completionBlock = ^{
        for (int i  = 0;  i < 5; 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)}

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

 

 

 
 

转载于:https://www.cnblogs.com/huadeng/p/7043893.html

相关文章:

  • Spring源码-IOC容器(六)-bean的循环依赖
  • Android 图片缓存处理
  • iOS中 OC字符串 与 C语言字符串 相互转换
  • php+Ajax 例子
  • 英语句型——口语
  • 三重积分计算--切片法
  • 关于梦想
  • 不用軟體解PPT密碼
  • 元组
  • activemq使用
  • 一个程序猿的遗嘱么?
  • Linux IO模式及 select、poll、epoll详解
  • bzoj 1600 amp; Usaco 月赛 2008 建造栅栏 题解
  • intellij idea svn 修改文件后,父文件夹也标注修改
  • VS 2015支持C语言和C++程序
  • 30天自制操作系统-2
  • C++11: atomic 头文件
  • css的样式优先级
  • ES6之路之模块详解
  • java8 Stream Pipelines 浅析
  • Javascripit类型转换比较那点事儿,双等号(==)
  • javascript从右向左截取指定位数字符的3种方法
  • k8s 面向应用开发者的基础命令
  • mysql外键的使用
  • node学习系列之简单文件上传
  • Python实现BT种子转化为磁力链接【实战】
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • scala基础语法(二)
  • Web Storage相关
  • WinRAR存在严重的安全漏洞影响5亿用户
  • yii2中session跨域名的问题
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 关于for循环的简单归纳
  • 基于 Babel 的 npm 包最小化设置
  • 记一次删除Git记录中的大文件的过程
  • 让你的分享飞起来——极光推出社会化分享组件
  • 小试R空间处理新库sf
  • 一些关于Rust在2019年的思考
  • 用简单代码看卷积组块发展
  • ​决定德拉瓦州地区版图的关键历史事件
  • !!java web学习笔记(一到五)
  • #define用法
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $.each()与$(selector).each()
  • (C语言)字符分类函数
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (八)Spring源码解析:Spring MVC
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (实战篇)如何缓存数据
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET连接MongoDB数据库实例教程
  • .sh