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

NSOperationQueue队列中 *** 作依赖相关思考,第1张

概述添加依赖后,队列中网络请求任务有依赖关系时,任务结束判定以数据返回为准还是以发起请求为准? waitUntilFinished方法容易误解。 依赖关系 // // ViewController.m / 添加依赖后,队列中网络请求任务有依赖关系时,任务结束判定以数据返回为准还是以发起请求为准?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 op2020-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 error2020-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队列中 *** 作依赖相关思考全部内容,希望文章能够帮你解决NSOperationQueue队列中 *** 作依赖相关思考所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/999316.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-21
下一篇2022-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存