NSOperationQueue—总结
2015-07-17 19:56
766 查看
@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
相关文章推荐
- 1062. Talent and Virtue (25)
- 根据QUI修改打造的自定义Qt界面
- 1252 - Twenty Questions(状态压缩DP)
- Codeforces 321B Ciel and Duel KM
- (简单) POJ 3368 Frequent values,RMQ。
- POJ 2299 Ultra-QuickSort (归并排序求逆序数)
- 【leetcode】Repeated DNA Sequences
- µVision中的Key Sequence 中文
- iOS FMDB--UIImage的插入与读取
- Codeforces Round #FF (Div. 1)——A贪心——DZY Loves Sequences
- Android开发UI之Toast的使用
- UIScrollView 属性 contentOffset.y 莫名变成-20
- UILocalNotification本地推送
- executeQuery,executeUpdate 和 execute 区别
- UIImagePickerController 打开图片库和相机选择图片
- C#下每次build自动版本号更新
- UI_storyboard实现页面回调
- contextRelative是用来设置当前path路径的为“true”为当前根路径
- golang build error: syntax error: nested func not allowed
- __set($key,$values) 和__get($varName) 魔术方法设置读取私有属性