第02天多线程网络:(12):NSOperation的其他用法(暂停恢复取消最大并发数)
2017-04-18 00:00
190 查看
#####一、NSOperation的其他用法(暂停恢复取消最大并发数)
code
VC
>>开始 // 1.创建队列 // 默认是并发 (随机执行) self.queue.maxConcurrentOperationCount>1 // 如何变成串行队列 self.queue = [[NSOperationQueue alloc]init]; self.queue.maxConcurrentOperationCount = 1; LYHOperation *op1 = [[LYHOperation alloc]init]; [self.queue addOperation:op1]; >>暂停 [self.queue setSuspended:YES]; >>继续 [self.queue setSuspended:NO]; >>取消 [self.queue cancelAllOperations]; // 不可以恢复的
code
>>>LYHOperation.h #import <Foundation/Foundation.h> @interface LYHOperation : NSOperation @end >>>LYHOperation.m #import "LYHOperation.h" @implementation LYHOperation - (void)main { // 3个耗时操作 for (NSInteger i = 0; i<1000; i++) { NSLog(@"download--- %zd %@",i,[NSThread currentThread]); } // 判断当前操作是否取消 , 苹果官方的建议 (最好等待每个操作执行完才停止,如果放到循环里面虽然可以每一个循环都可以监听到,但是会消耗性能) if(self.isCancelled) return; NSLog(@"++++++++++"); for (NSInteger i = 0; i<1000; i++) { NSLog(@"download2--- %zd %@",i,[NSThread currentThread]); } if(self.isCancelled) return; NSLog(@"++++++++++"); for (NSInteger i = 0; i<1000; i++) { NSLog(@"download3--- %zd %@",i,[NSThread currentThread]); } } @end
VC
#import "ViewController.h" #import "LYHOperation.h" @interface ViewController () /** 队列 */ @property(nonatomic, strong)NSOperationQueue *queue; @end @implementation ViewController - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self demo]; } #pragma mark 3、demo 自定义 NSOperation - (void)demo { // 1.创建队列 // 默认是并发 (随机执行) // 如何变成串行队列 self.queue = [[NSOperationQueue alloc]init]; self.queue.maxConcurrentOperationCount = 1; LYHOperation *op1 = [[LYHOperation alloc]init]; [self.queue addOperation:op1]; } #pragma mark 2、队列的 开始\继续\暂停\取消 操作 - (IBAction)start { // 1.创建队列 // 默认是并发 (随机执行) // 如何变成串行队列 self.queue = [[NSOperationQueue alloc]init]; self.queue.maxConcurrentOperationCount = 1; LYHOperation *op1 = [[LYHOperation alloc]init]; [self.queue addOperation:op1]; // NSLog(@"开始"); // // 1.创建队列 // // 默认是并发 (随机执行) // // 如何变成串行队列 // self.queue = [[NSOperationQueue alloc]init]; // // // 最大并发数 maxConcurrentOperationCount // // 2.设置最大的并发数 // // 同一时间最多有多少个任务可以执行 // // maxConcurrentOperationCount > 1 大于1 是并发队列 等于1是一个串行队列 // // maxConcurrentOperationCount = 0 不会执行任务 -1默认值(在计算机表示最大值) 不受限制 // self.queue.maxConcurrentOperationCount = 1; // // // 3.封装操作 // NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ // for (NSInteger i = 0; i<1000; i++) { // NSLog(@"1- %zd-- %@",i,[NSThread currentThread]); // } // // }]; // // NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ // for (NSInteger i = 0; i<1000; i++) { // NSLog(@"2- %zd-- %@",i,[NSThread currentThread]); // } }]; // // NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{ // for (NSInteger i = 0; i<1000; i++) { // NSLog(@"3- %zd-- %@",i,[NSThread currentThread]); // } }]; // // NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{ // for (NSInteger i = 0; i<1000; i++) { // NSLog(@"4- %zd-- %@",i,[NSThread currentThread]); // } }]; // // NSBlockOperation *op5 = [NSBlockOperation blockOperationWithBlock:^{ // for (NSInteger i = 0; i<1000; i++) { // NSLog(@"5- %zd-- %@",i,[NSThread currentThread]); // } }]; // // NSBlockOperation *op6 = [NSBlockOperation blockOperationWithBlock:^{ // for (NSInteger i = 0; i<1000; i++) { // NSLog(@"6- %zd-- %@",i,[NSThread currentThread]); // } }]; // // NSBlockOperation *op7 = [NSBlockOperation blockOperationWithBlock:^{ // for (NSInteger i = 0; i<1000; i++) { // NSLog(@"7- %zd-- %@",i,[NSThread currentThread]); // } }]; // // [_queue addOperation:op1]; // [_queue addOperation:op2]; // [_queue addOperation:op3]; // [_queue addOperation:op4]; // [_queue addOperation:op5]; // [_queue addOperation:op6]; // [_queue addOperation:op7]; // // // // suspended } - (IBAction)stop { NSLog(@"暂停"); // 让队列暂停 /* 暂停是可以 恢复的 队列中的任务 也是有状态的:已经执行完毕的状态 | 正在执行的状态 | 处于排队等待状态 */ // 不能暂停当前正在处于执行状态的任务 [self.queue setSuspended:YES]; } - (IBAction)goOn { NSLog(@"继续"); [self.queue setSuspended:NO]; } - (IBAction)cancel { NSLog(@"取消"); #pragma mark 方法 - (void)cancelAllOperations; /* 该方法 内部调用了所有操作的cancel方法 - (void)cancelAllOperations; Description Cancels all queued and executing operations. This method calls the cancel method on all operations currently in the queue. Canceling the operations does not automatically remove them from the queue or stop those that are currently executing. For operations that are queued and waiting execution, the queue must still attempt to execute the operation before recognizing that it is canceled and moving it to the finished state. For operations that are already executing, the operation object itself must check for cancellation and stop what it is doing so that it can move to the finished state. In both cases, a finished (or canceled) operation is still given a chance to execute its completion block before it is removed from the queue. Availability iOS (2.0 and later), macOS (10.5 and later), tvOS (9.0 and later), watchOS (2.0 and later) */ [self.queue cancelAllOperations]; // 不可以恢复的 } #pragma mark 1、NSOperationQueue的 maxConcurrentOperationCount 设置 串行或者并行 - (void)initOpreation { // 1.创建队列 // 默认是并发 (随机执行) // 如何变成串行队列 NSOperationQueue *queue = [[NSOperationQueue alloc]init]; // 最大并发数 maxConcurrentOperationCount // 2.设置最大的并发数 // 同一时间最多有多少个任务可以执行 // maxConcurrentOperationCount > 1 大于1 是并发队列 等于1是一个串行队列 // maxConcurrentOperationCount = 0 不会执行任务 -1默认值(在计算机表示最大值) 不受限制 queue.maxConcurrentOperationCount = 1; // 3.封装操作 NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"1--- %@",[NSThread currentThread]); }]; NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"2--- %@",[NSThread currentThread]); }]; NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"3--- %@",[NSThread currentThread]); }]; NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"4--- %@",[NSThread currentThread]); }]; NSBlockOperation *op5 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"5--- %@",[NSThread currentThread]); }]; NSBlockOperation *op6 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"6--- %@",[NSThread currentThread]); }]; NSBlockOperation *op7 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"7--- %@",[NSThread currentThread]); }]; [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op3]; [queue addOperation:op4]; [queue addOperation:op5]; [queue addOperation:op6]; [queue addOperation:op7]; // suspended } @end
相关文章推荐
- 第02天多线程网络:(09):NSOperation基本概念
- 第02天多线程网络:(14):NSOperation实现线程间通信
- iOS 多线程编程<十、NSOperationQueue最大并发量、暂停、取消>
- 第02天多线程网络:(11):自定义NSOperation
- NSOperation的高级功能——线程间通信&最大并发数&挂起&取消全部操作
- IOS学习 NSOperation 并发数量、暂停/继续、取消、等待、依赖 与GCD区别
- [iOS 多线程 & 网络 - 2.4] - 大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)
- [iOS 多线程 & 网络 - 2.4] - 大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)
- iOS学习笔记-118.多线程17——NSOperationQueue队列的取消、暂停、恢复
- 第02天多线程网络:(13):NSOperation操作依赖和监听
- iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信
- [网络和多线程]8、GCD的其他用法
- C++多线程编程经验——线程暂停、恢复
- ios多线程操作(十二)—— 自定义NSOperation实现网络下载后回调
- [iOS 多线程 & 网络 - 1.3] - NSOperation
- 猫猫学iOS(五十四)多线程网络之NSOperation重要知识
- 猫猫学iOS(五十三)多线程网络之NSOperation简介
- 【Unix 网络编程】服务器网络编程模型——多线程并发模型
- iOS多线程管理-Thread,NSOperation,GCD的简单用法
- core java 10~12(多线程 & I/O & Network网络编程)