• 添加依赖后,队列中网络请求任务有依赖关系时,任务结束判定以数据返回为准还是以发起请求为准?
  • waitUntilFinished方法容易误解。

依赖关系

//
// ViewController.m
// OperationTest0108
//
// Created by LongMa on 2020/1/8.
// #import "ViewController.h"
#import <AFNetworking/AFNetworking.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
[self testQueue];
} - (void)testQueue{
NSOperationQueue *lQ = [[NSOperationQueue alloc] init]; //任务最大并发数,与是否开启子线程无关。
// lQ.maxConcurrentOperationCount = 1; NSBlockOperation *lOp0 = [NSBlockOperation blockOperationWithBlock:^{
AFHTTPSessionManager *lMng = [AFHTTPSessionManager manager];
[lMng POST:@"https://www.baidu.com" parameters:@{
@"mapId" : @"1"
} progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"0 suc");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"0 error");
}]; NSLog(@"0 %@", [NSThread currentThread]);
}]; NSBlockOperation *lOp1 = [NSBlockOperation blockOperationWithBlock:^{
AFHTTPSessionManager *lMng = [AFHTTPSessionManager manager];
[lMng POST:@"https://www.baidu.com" parameters:@{
@"mapId" : @"1"
} progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"1 suc");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"1 error");
}]; NSLog(@"1 %@", [NSThread currentThread]);
}]; NSBlockOperation *lOp2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2 %@", [NSThread currentThread]);
}]; [lOp0 addDependency:lOp1]; NSLog(@"before add op"); [lQ addOperations:@[lOp0] waitUntilFinished:NO];
[lQ addOperations:@[lOp1] waitUntilFinished:NO];
[lQ addOperations:@[lOp2] waitUntilFinished:NO];
} @end

执行结果

2020-01-08 18:02:31.378260+0800 OperationTest0108[1583:527022] before add op
2020-01-08 18:02:31.378635+0800 OperationTest0108[1583:527045] 2 <NSThread: 0x283db43c0>{number = 4, name = (null)}
2020-01-08 18:02:31.379722+0800 OperationTest0108[1583:527047] 1 <NSThread: 0x283db4240>{number = 5, name = (null)}
2020-01-08 18:02:31.380265+0800 OperationTest0108[1583:527047] 0 <NSThread: 0x283db4240>{number = 5, name = (null)}
2020-01-08 18:02:31.915236+0800 OperationTest0108[1583:527022] 0 error
2020-01-08 18:02:31.921841+0800 OperationTest0108[1583:527022] 1 error

由上面log可知:任务结束判定以发起请求为准!数据返回是异步的,不受依赖关系影响!

waitUntilFinished方法

当把上面代码

[lQ addOperations:@[lOp0] waitUntilFinished:NO];

改为

[lQ addOperations:@[lOp0] waitUntilFinished:YES];

时,

log如下,没有正常执行操作:

2020-01-08 18:03:55.308276+0800 OperationTest0108[1587:527738] before add op

分析:

waitUntilFinished方法定义为:

If YES, the current thread is blocked until all of the specified operations finish executing. If NO, the operations are added to the queue and control returns immediately to the caller.

当为YES时,当前线程被阻塞,直到被添加的操作执行完毕。上面代码使线程依赖于lOp0执行完毕,而lOp0的执行依赖于lOp1执行完毕。由于lOp1比lOp0加入队列更晚。当上面代码被执行时,线程在等lOp0执行完毕,而此时lOp1还没被加入队列中,即lOp1还没开始执行,所以线程一直处于阻塞状态!当然,合理利用waitUntilFinished方法,也能实现想要的特殊效果。

NSOperationQueue队列依赖相关思考的更多相关文章

  1. 通过GCD、NSOperationQueue队列、NSThread三种方法来创建多线程

    #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutl ...

  2. 【PHP数据结构】队列的相关逻辑操作

    在逻辑结构中,我们已经学习了一个非常经典的结构类型:栈.今天,我们就来学习另外一个也是非常经典的逻辑结构类型:队列.相信不少同学已经使用过 redis . rabbitmq 之类的缓存队列工具.其实, ...

  3. .netcore ioc 循环依赖问题及其相关思考之DispatchProxy

    .netcore引入了ioc机制让开发人员逐步习惯从过去的各种new对象变成通过IOC框架来管理对象的生命周期.这样当我们需要某个对象的时候,我们一般在构造函数里申明该对象的接口,即可通过ioc容器创 ...

  4. 关于ASP.NET WebAPI中HTTP模型的相关思考

    对于.NET的分布式应用开发,可以供我们选择的技术和框架比较多,例如webservice,.net remoting,MSMQ,WCF等等技术.对于这些技术很多人都不会陌生,即时没有深入的了解,但是肯 ...

  5. [视频教程] 基于redis的消息队列实现与思考

    使用redis的list列表来实现消息队列功能,相信大家都听过消息队列,但是在业务中可能并没有真正去使用它.在公司项目中正好有个场景使用到了消息队列,因此就来说一下流程.在web界面上有个功能是群发邮 ...

  6. Maven中的依赖相关总结

    一.Maven的依赖作用域scope compile:编译.测试.运行都会依赖,会打进包中. rumtime:不存于编译,后期运行和测试都会参与,会打进包中. test:只在test classpat ...

  7. KVM on CubieTruck 原理以及网络性能相关思考

    1.virtio框架包括哪些? (1)virtio:面向guest驱动的API接口,它在概念上将前端驱动附加到后端驱动,具体实现位于driver/virtio/virtio.c (2)Transpor ...

  8. 浮点与整形在GUI下的相关思考

    平时不接触绘图,似乎感觉不到浮点和整形所带来的区别,这次项目中意外的碰到了浮点与整形进行迁移的工作.因此写点心得,让自己以后也可以看看. 用浮点作图有个最大的弊端就是边界情况,比如你需要在点(20,2 ...

  9. linux消息队列通信

    IPC机制 进程间通信机制(Inter Process Communication,IPC),这些IPC机制的存在使UNIX在进程通信领域手段相当丰富,也使得程序员在开发一个由多个进程协作的任务组成的 ...

随机推荐

  1. VSCode配置启动Vue项目

    下载安装并配置VSCode 随便百度上搜个最新的VSCode安装好后,点击Ctrl + Shit + X打开插件扩展窗口进行插件扩展,这里要安装两个插件. 1.vetur插件的安装 该插件是vue文件 ...

  2. docker + jenkins 自动化部署

    公司书架上有本docker的书籍,正好最近事不多就写个demo来玩一玩. DevOps未死,ContainerOps已到 ContainerOps VS DevOps 避免了复杂的环境,应用之间的相互 ...

  3. js如何获取地址栏上的参数id

    直接上js代码   方法1: 父页面跳转地址栏带id>>>>window.location.href='${ctxAdmin}/study/checkForm?id='+id+ ...

  4. jQuery 文档操作 - remove() 方法

    移除所有 <p> 元素: 定义和用法 remove() 方法移除被选元素,包括所有文本和子节点. 该方法不会把匹配的元素从 jQuery 对象中删除,因而可以在将来再使用这些匹配的元素. ...

  5. poj 3278(hdu 2717) Catch That Cow(bfs)

    Catch That Cow Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. pytorch中squeeze()和unsqueeze()函数介绍

    一.unsqueeze()函数 1. 首先初始化一个a 可以看出a的维度为(2,3) 2. 在第二维增加一个维度,使其维度变为(2,1,3) 可以看出a的维度已经变为(2,1,3)了,同样如果需要在倒 ...

  7. UA

    我们可以通过userAgent来判断,比如检测某些关键字,例如:AppleWebKit*****Mobile或AppleWebKit,需要注意的是有些浏览器的userAgent中并不包含AppleWe ...

  8. 前后端结合的 WAF

    前言 之前介绍了一些前后端结合的中间人攻击方案.由于 Web 程序的特殊性,前端脚本的参与能大幅弥补后端的不足,从而达到传统难以实现的效果. 攻防本为一体,既然能用于攻击,类似的思路同样也可用于防御. ...

  9. index() 方法返回指定元素相对于其他指定元素的 index 位置。

  10. python基础四之列表

    列表详解 列表的增删改查! 增加 li = ['zxc', 'is', 'a'] # append 在列表结尾整体添加 修改列表,但是没有返回值 li.append('boy') print(li) ...