您的位置:首页 > 理论基础 > 计算机网络

第02天多线程网络:(12):NSOperation的其他用法(暂停恢复取消最大并发数)

2017-04-18 00:00 190 查看
#####一、NSOperation的其他用法(暂停恢复取消最大并发数)

>>开始
// 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Objective-C 多线程
相关文章推荐