#import "NSOperationVC.h"
@interface NSOperationVC ()
@property(nonatomic,strong) NSOperationQueue *opQ;
@end
@implementation NSOperationVC
- (void)viewDidLoad {
[super viewDidLoad];
self.opQ = [[NSOperationQueue alloc]init];
[self demo7];
}
/*
NSInvocationOperation
*/
- (void)demo1{
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadimage:) object:@"ddd"];
NSOperationQueue *q = [[NSOperationQueue alloc]init];
[q addOperation:op];
}
- (void)downloadimage:(id)objc {
NSLog(@"%@",[NSThread currentThread]);
}
/*
- NSBlockOperation 代码便于维护
*/
- (void)demo2{
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"block");
}];
NSOperationQueue *q = [[NSOperationQueue alloc]init];
[q addOperation:op];
}
/*
- 更加简单
*/
- (void)demo3{
NSOperationQueue *q = [[NSOperationQueue alloc]init];
[q addOperationWithBlock:^{
NSLog(@"更加简单");
}];
}
/*
NSInvocationOperation
*/
-(void)demo4{
NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downloadimage:) object:@""];
[self.opQ addOperation:op];
}
/*
NSOperationQueue 回归主线程
*/
-(void)demo5{
[self.opQ addOperationWithBlock:^{
NSLog(@"子线程");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"主线程");
NSLog(@"%@",[NSThread currentThread]);
}];
}];
}
/*
NSOperationQueue最大并发数
*/
-(void)demo7 {
//设置最大并发线程
self.opQ.maxConcurrentOperationCount = 3;
for (int i=0; i<10; i++) {
[self.opQ addOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
}
}
//线程的暂停和开始
-(void)stopBegan{
//判断队列是否挂起 YES 挂起 NO没有挂起
if (self.opQ.isSuspended) {
//操作数
NSLog(@"%lu",(unsigned long)self.opQ.operationCount);
self.opQ.suspended = NO;
}else {
self.opQ.suspended = YES;
}
}
//取消当前全部操作
-(void)cancle{
[self.opQ cancelAllOperations];
}
/*
- 依赖关系
*/
-(void)dependecy{
/*
例子:下载、解压、通知用户
*/
//下载
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载---%@",[NSThread currentThread]);
}];
//解压
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"解压---%@",[NSThread currentThread]);
}];
//通知用户
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"通知用户---%@",[NSThread currentThread]);
}];
//NSOperationQueue 提供了依赖关系 顺序执行
//注意循环依赖,
[op2 addDependency:op1];
[op3 addDependency:op2];
//添加到队列waitUntilFinished 是否需要等待 就是它不执行完后面代码无法执行
//如果是YES 会阻塞当前线程
[self.opQ addOperations:@[op1,op2,op3] waitUntilFinished:YES];
//线程间通讯 通知主线程做操作
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"主线程---%@",[NSThread currentThread]);
}];
NSLog(@"come here");
}
/*
- NSOperation核心概念 :将操作 添加到 队列
不能直接使用 使用其子类
*/
/*
NSOperation 是苹果公司大力推荐的”并发”技术! 开发者已经不需要关心线程以及线程的生命周期!
,而且我们逃离了GCD的 并发还是串行 异步还是同步!
NSOperation 的核心概念: 将”操作” 添加到 “队列”
GCD的核心概念: 将”任务”添加到队列,指定任务的执行函数(方法)
GCD & NSOperation 的对比
GCD 在 iOS 4.0推出的,主要针对多核处理器做了优化的并发技术,是 C 语言!
- 将”任务”[block]”添加到”队列[串行/并发/主队列/全局],并且指定执行任务的函数[同步/异步]
- 线程间的通讯 dispatch_get_main_queue()
- 提供了一些 NSOperation 不具备的功能
- 一次执行(单例设计模式最常用)
- 延迟执行
- 调度组
- 等等…
NSOperation 在 iOS 2.0 推出的!
- 将操作[异步执行的任务] 添加到 队列[并发队列],就会立刻异步执行
- mainQueue
- 提供了一些 GCD 实现起来比较困难的功能
- 最大并发线程数
- 队列的暂停/继续
- 取消所有操作
- 指定操作之间的依赖关系(GCD使用 同步实现)
NSOperation类是一个抽象类
特点:
- 不能直接使用
目的:
- 定义子类中共有的属性和方法
子类:
- NSInvocationOperation
- NSBlockOperation
*/
@end