NSOperationQueue小结

#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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值