五:多线程--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)。
9 - (void)viewDidLoad
10 {
11 [super viewDidLoad];
12
13 //创建NSInvocationOperation对象,封装操作
14 NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
15 NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
16 //创建对象,封装操作
17 NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
18 for (int i=0; i<5; i++) {
19 NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
20 }
21 }];
22 [operation3 addExecutionBlock:^{
23 for (int i=0; i<5; i++) {
24 NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
25 }
26 }];
27
28 //设置操作依赖
29 //先执行operation2,再执行operation1,最后执行operation3
30 [operation3 addDependency:operation1];
31 [operation1 addDependency:operation2];
32
33 //不能是相互依赖
34 // [operation3 addDependency:operation1];
35 // [operation1 addDependency:operation3];
36
37 //创建NSOperationQueue
38 NSOperationQueue * queue=[[NSOperationQueue alloc]init];
39 //把操作添加到队列中
40 [queue addOperation:operation1];
41 [queue addOperation:operation2];
42 [queue addOperation:operation3];
43 }
44
45 -(void)test1
46 {
47 for (int i=0; i<5; i++) {
48 NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
49 }
50 }
51
52 -(void)test2
53 {
54 for (int i=0; i<5; i++) {
55 NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
56 }
57 }
58
59 @end

可以监听一个操作的执行完毕
- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;
代码示例
第一种方式:可以直接跟在任务后面编写需要完成的操作,如这里在下载图片后,紧跟着下载第二张图片。但是这种写法有的时候把两个不相关的操作写到了一个代码块中,
代码的可阅读性不强。
9 - (void)viewDidLoad
10 {
11 [super viewDidLoad];
12
13 //创建对象,封装操作
14 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
15 NSLog(@"-operation-下载图片-%@",[NSThread currentThread]);
16 //.....下载图片后继续进行的操作
17 NSLog(@"--接着下载第二张图片--");
18 }];
19
20 //创建队列
21 NSOperationQueue *queue=[[NSOperationQueue alloc]init];
22 //把任务添加到队列中(自动执行,自动开线程)
23 [queue addOperation:operation];
24 }
25
26 @end 第二种方式:
9 - (void)viewDidLoad
10 {
11 [super viewDidLoad];
12
13 //创建对象,封装操作
14 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
15 for (int i=0; i<10; i++) {
16 NSLog(@"-operation-下载图片-%@",[NSThread currentThread]);
17 }
18 }];
19
20 //监听操作的执行完毕
21 operation.completionBlock=^{
22 //.....下载图片后继续进行的操作
23 NSLog(@"--接着下载第二张图片--");
24 };
25
26 //创建队列
27 NSOperationQueue *queue=[[NSOperationQueue alloc]init];
28 //把任务添加到队列中(自动执行,自动开线程)
29 [queue addOperation:operation];
30 }
打印查看:

说明:在上一个任务执行完后,会执行operation.completionBlock=^{}代码段,且是在当前线程执行(2)。
五:多线程--NSOperation基本操作的更多相关文章
- iOS开发多线程篇—NSOperation基本操作
iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...
- iOS开发多线程篇 10 —NSOperation基本操作
iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...
- iOS开发——多线程OC篇&(十)多线程NSOperation基本使用
NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最⼤大并发数的 ...
- {python--GIL锁}一 介绍 二 GIL介绍 三 GIL与Lock 四 GIL与多线程 五 多线程性能测试
python--GIL锁 GIL锁 本节目录 一 介绍 二 GIL介绍 三 GIL与Lock 四 GIL与多线程 五 多线程性能测试 一 背景知识 ''' 定义: In CPython, the gl ...
- 多线程 (五)NSOperation
NSOperation是对GCD的分装,OC语言,更简单方便 NSOperation和NSOperationQueue一起使用也能实现多线程编程 基本步骤: 将操作封装到一个NSOperation对象 ...
- IOS高级开发之多线程(五)NSOperation 2
接着看NSOperation.NSOperationQueue线程间的通信: 应用场景:比如我们经常把一些耗时的操作比如下载图片放在子线程,那么当这个完成之后,我们就需要回到主线程,这个时候就需要用到 ...
- iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信
一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加 ...
- 3.多线程NSOperation
1.NSOperation的基本操作 使用NSOperation的两个子类,NSInvocationOperation 和 NSBlockOperation 创建操作,然后将操作添加到队列中去执行 / ...
- iOS多线程 NSOperation的用法
上一篇写了 GCD 的使用,接下来就了解一下 NSOperation ,NSOperation是苹果对 GCD 的 OC 版的一个封装,但是相对于GCD来说可控性更强,并且可以加入操作依赖. NSOp ...
随机推荐
- HDU 5421 Victor and String
Victor and String Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on HDU. Orig ...
- 【01背包变形】Robberies HDU 2955
http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...
- 把disable maven nature后的项目,恢复菜单呈现出来(Convert to Maven Project)
把disable maven nature后的项目,恢复菜单呈现出来(Convert to Maven Project) 有的时候需求把disable maven nature后的项目,再转换为mav ...
- hdu1588:Gauss Fibonacci
对每个0<=i<n求f(g(i))的和,其中f(x)为斐波那契数列第x项,g(i)=k*i+b,k,b,n给定,模数给定. 斐波那契数有一种用矩阵乘法求的方法,这个矩阵A自己写,令F[i] ...
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
前言说明 本篇为网易云课堂Linux内核分析课程的第七周作业,本次作业我们将具体来分析exec*函数对应的系统调用处理过程,来分析Linux内核如何来执行一个可执行程序,由于有一个在网易云课堂共同学习 ...
- mybatis几种开发方式
mybatis是比较轻巧的半自动化的CRM框架,它有几种开发方式,现今张列于此: 一.注解方式:在接口方法上面写SQL语句,有点类似springdataJPA 的query sql 语句 范例 @se ...
- Java日志框架-Logback手册中文版以及官方配置文档教程
Logback手册中文版:(链接: https://pan.baidu.com/s/1bpMyasR 密码: 6u5c),虽然版本有点旧,但是大体意思差不多,先用中文版了解个大概,然后一切最新的配置以 ...
- Office EXCEL 如何保留两位小数,四舍五入
选中若干单元格,然后右击设置单元格格式,数值中保留两位小数 使用round函数四舍五入,如下图所示,我在N10单元格中输入"ROUND(M10,1)"即可,其中ROUND是函数 ...
- poj 1258 Agri-Net(Prim)(基础)
Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44487 Accepted: 18173 Descri ...
- 关于disable和readonly
我们在做网页时,难免的会因为权限或者各种原因,想让使用者看到,但是却不想让用户去对值进行更改,我们有两个选择 一.我们使用disabled将文本框禁用掉. 二.我们使用readonly使得文本框只能读 ...