前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NSOperationQueue队列中操作依赖相关思考

NSOperationQueue队列中操作依赖相关思考

作者头像
woopDast1
发布2020-09-04 10:45:29
4290
发布2020-09-04 10:45:29
举报
文章被收录于专栏:iOSeriOSer
  • 添加依赖后,队列中网络请求任务有依赖关系时,任务结束判定以数据返回为准还是以发起请求为准?
  • waitUntilFinished方法容易误解。

依赖关系

代码语言:javascript
复制
//
//  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

执行结果

代码语言:javascript
复制
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方法

当把上面代码

代码语言:javascript
复制
[lQ addOperations:@[lOp0] waitUntilFinished:NO];

改为

代码语言:javascript
复制
[lQ addOperations:@[lOp0] waitUntilFinished:YES];

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

代码语言:javascript
复制
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方法,也能实现想要的特殊效果。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 依赖关系
  • waitUntilFinished方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档