11、NSOperation的其他操作

1、最大并发数
1)什么是并发数:同时执行的任务书
比如:同时开3个线程执行3个任务,并发数就是3

2)最大并发数的相关方法
- (NSInteger) maxConcurrentOperationCount;
- (void) setMaxConcurretOperationCount: (NSInteger) cnt;

3)执行的过程
·把操作添加到队列self.queue addOperationWithBlock
·去线程池去取空闲的线程,如果没有就创建新线程
·把操作交给从线程池中取出的线程执行操作
·执行完成后,把线程再放回线程池中
·重复2,3,4的步骤,直到所有的操作都执行完毕


2、队列的取消、暂停和恢复
1)取消队列的操作
- (void) cancel; 该方法取消单个操作
- (void) cancelAlloPertions; 该方法取消所有操作

2)暂停和恢复队列的操作
- (void) setSuspended: (BOOL) b;//YES代表暂停队列,NO代表恢复队列
- (BOOL) isSupspended; 判断该队列是否处于暂停状态


3、操作的并发数、取消、暂停和恢复的演示案例
@interface ViewController ()
//全局队列
@property (nonatomic, strong) NSOperationQueue *queue;
@end

@implementation ViewController
//懒加载
- (NSOperationQueue *)queue {
if (_queue == nil) {
_queue = [[NSOperationQueue alloc] init];
//设置最大并发数(并不是线程数)
_queue.maxConcurrentOperationCount = 2;
}
return _queue;
}

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
for (int i = 0; i < 20; i++) {
[self.queue addOperationWithBlock:^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"%d %@",i,[NSThread currentThread]);
}];
}
}
//取消所有操作 当前正在执行的操作会执行完毕,取消后续的所有操作
- (IBAction)cancel:(id)sender {
[self.queue cancelAllOperations];
NSLog(@"取消");
}

//暂停 操作 当前正在执行的操作,会执行完毕,后续的操作会暂停
- (IBAction)suspend:(id)sender {
self.queue.suspended = YES;
NSLog(@"暂停");
}

//继续 操作
- (IBAction)resume:(id)sender {
self.queue.suspended = NO;
NSLog(@"继续");
}

//当操作执行完毕,会从队列中移除
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//队列中的操作数
NSLog(@"%zd",self.queue.operationCount);
}

@end


4、操作的优先级
1)设置NSOperation在queue中的优先级,可以改变操作的执行优先级
- (NSOperationQueuePriority) queuePriority;
- (void) setQueuePriority: (NSOperationQueuePriority) p;

2)IOS8以后推荐使用服务质量 qualityOfService


5、监听一个操作完成
- ( void (^) (void) ) completionBlock;
- (void) setCompletionBlock: ( void (^) (void) ) block;


6、操作的优先级及操作完成监听的演示案例
@interface ViewController ()
@property (nonatomic, strong) NSOperationQueue *queue;
@end

@implementation ViewController
//懒加载
- (NSOperationQueue *)queue{
if (_queue == nil) {
_queue = [NSOperationQueue new];
}
return _queue;
}

- (void)viewDidLoad {
[super viewDidLoad];

//操作1
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 20; i++) {
NSLog(@"op1 %d",i);
}
}];
//设置优先级最高
op1.qualityOfService = NSQualityOfServiceUserInteractive;
[self.queue addOperation:op1];
//等操作完成,执行 执行在子线程上
[op1 setCompletionBlock:^{
NSLog(@"============op1 执行完成========== %@",[NSThread currentThread]);
}];
//操作2
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 20; i++) {
NSLog(@"op2 %d",i);
}
}];
//设置优先级最低
op2.qualityOfService = NSQualityOfServiceBackground;
[self.queue addOperation:op2];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


7、操作依赖
NSOperation之间可以设置依赖来保证执行顺序
比如一定要让操作A执行完毕后,才能执行操作B,可以这么写
[operationB addDependency: operationA];//操作B依赖于操作A

可以在不同queue的NSOpaertion之间创建依赖关系

8、模拟软件升级过程,下载-解压-升级完成(依赖注入)
@interface ViewController ()
@property (nonatomic, strong) NSOperationQueue *queue;
@end

@implementation ViewController
- (NSOperationQueue *)queue {
if (_queue == nil) {
_queue = [NSOperationQueue new];
}
return _queue;
}

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

// 下载 - 解压 - 升级完成
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载");
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"解压");
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"升级完成");
}];
//设置操作间的依赖
[op2 addDependency:op1];
[op3 addDependency:op2];
//错误,会发生循环依赖,什么都不执行
//[op1 addDependency:op3];
//操作添加到队列中
[self.queue addOperations:@[op1,op2] waitUntilFinished:NO];
//依赖关系可以夸队列执行
[[NSOperationQueue mainQueue] addOperation:op3];
}

@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值