@interface ViewController ()
/** 全局操作队列,调用所有的异步操作 */
@property (nonatomic, strong) NSOperationQueue *opQueue;
@end
@implementation ViewController
/**
NSOperation 是苹果公司大力推荐的"并发"技术!程序员已经不在需要关心线程以及线程的生命周期!
NSOperation 的核心概念:将"操作"添加到"队列"
GCD 的核心概念:将"任务"添加到队列,指定任务的执行函数(方法)
---
GCD & NSOperation 的对比
GCD 在 iOS 4.0 推出的,主要针对多核处理器做了优化的并发技术,是 C 语言的
-将"任务[block]"添加到"队列[串行/并发/主队列/全局队列]",并且指定执行任务的函数[同步/异步]
-线程间通讯 dispatch_get_main_queue()
-提供了一些 NSOperation 不具备的功能
- 一次性执行
- 延迟执行
- 调度组(在op中也可以做到,就是有点麻烦)
NSOperation 在 iOS 2.0 推出的,苹果推出 GCD 之后,对 NSOperation 底层重写了一遍
-将操作[异步执行的任务]添加到队列[并发队列],就会立即异步执行
-mainQueue
-提供了一些 GCD 实现起来比较困难的功能!
- 最大并发操作数
- 队列的暂停/继续
- 取消所有操作
- 指定操作之间的依赖关系 (GCD 用同步实现)
---
NSOperation 类是一个抽象类
特点:
- 不能直接使用!
目的:
- 定义子类共有的属性和方法
子类
- NSInvocationOperation
- NSBlockOperation
- UIGestureRecognizer
- CAAnimation
- CAPropertyAnimation
- BASIC
- Keyframe
*/
- (NSOperationQueue *)opQueue {
if (_opQueue == nil) {
_opQueue = [[NSOperationQueue alloc] init];
}
return _opQueue;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self demo6];
}
// MARK: 线程间通讯
- (void)demo6 {
[self.opQueue addOperationWithBlock:^{
NSLog(@"耗时的操作 %@", [NSThread currentThread]);
// 主线程更新UI,主队列
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"UIUIUI --- %@", [NSThread currentThread]);
}];
}];
}
// MARK: 全局队列 - 只要是 NSOpeation 的子类,都可以添加到队列!
- (void)demo5 {
// 直接添加任务
for (int i = 0; i < 10; i++) {
[self.opQueue addOperationWithBlock:^{
NSLog(@"%@ --- %d", [NSThread currentThread], i);
}];
}
// block operation 同样可以添加到队列
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"BLOCK ---- %@ ---- %d ", [NSThread currentThread], 100);
}];
[self.opQueue addOperation:op1];
// invocation operation
NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@"invocation"];
[self.opQueue addOperation:op2];
}
// MARK: 更简单的
- (void)demo4 {
// 1. 队列 -> 队列如果每次分配会比较浪费!
// 在实际开发中,会使用全局的队列,统一调度所有异步执行的操作
NSOperationQueue *q = [[NSOperationQueue alloc] init];
// 2. 添加操作
for (int i = 0; i<10; i++) {
[q addOperationWithBlock:^{
NSLog(@"%@ --- %d", [NSThread currentThread], i);
}];
}
}
// MARK: NSBlockOperation 演练
// NSBlockOperation 所有的代码都写在一起,更加好维护
- (void)demo3 {
// 1. 队列
NSOperationQueue *q = [[NSOperationQueue alloc] init];
// 2. 操作
for (int i = 0; i<10; i++) {
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@ ---- %d ", [NSThread currentThread], i);
}];
[q addOperation:op];
}
}
// MARK: NSInvocationOperation演练
/**
结果:开启多个线程,不会顺序执行 -> GCD 并发队列,异步执行任务
NSOperation 本质上是对 GCD 的面相对象的封装
- 队列:本质上就是 GCD 的并发队列
- 操作:异步执行的任务
*/
- (void)demo2 {
// 1. 队列
NSOperationQueue *q = [[NSOperationQueue alloc] init];
for (int i = 0; i < 10; i++) {
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@(i)];
// 添加到队列
[q addOperation:op];
}
}
- (void)demo1 {
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@"invocation"];
// start 方法,会在当前线程执行调度方法
// [op start];
// 队列
NSOperationQueue *q = [[NSOperationQueue alloc] init];
// 将操作添加到队列 - 会自动异步执行调度方法
[q addOperation:op];
}
- (void)downloadImage:(id)obj {
NSLog(@"%@ %@", [NSThread currentThread], obj);
}
@end
NSOperationQueue—总结
最新推荐文章于 2024-09-10 13:31:17 发布