4.5 NSOperation->1.0 NSOperation简介

本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。


本文相关目录:
==================== 所属文集:4.0 多线程 ====================
4.1 多线程基础->1.0 进程 & 线程
······················ 2.0 多线程简介
4.2 pthread
4.3 NSThread->1.0 创建线程
····················· 2.0 线程属性
····················· 3.0 线程状态/线程生命周期
····················· 4.0 多线程安全隐患
····················· 5.0 线程间通讯和常用方法
4.4 GCD->1.0 GCD简介和使用
·············· 2.0 线程间的通信
·············· 3.0 其他用法
·············· 4.0 GCD 的定时器事件
4.5 NSOperation->1.0 NSOperation简介
························ 2.0 NSOperationQueue
························ 3.0 线程间通信
························ 4.0 自定义NSOperation
4.6 RunLoop - 运行循环
===================== 所属文集:4.0 多线程 =====================


NSOperation 的作用
使用 NSOperation 的目的:为了让开发人员不再关心线程

配合使用 NSOperation(任务) 和 NSOperationQueue(队列) 也能实现多线程编程

NSOperation 和 NSOperationQueue 实现多线程的具体步骤:
(1)先将需要执行的操作封装到一个NSOperation对象中
(2)然后将NSOperation对象添加到NSOperationQueue中
(3)系统会自动将NSOperationQueue中的NSOperation取出来
(4)将取出的NSOperation封装的操作放到一条新线程中执行

使用NSOperation子类的方式有3种:

NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类
1. NSInvocationOperation
2. NSBlockOperation
3. 自定义子类继承NSOperation,实现内部相应的方法


NSInvocationOperation
//创建NSInvocationOperation对象
- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;

//调用start方法开始执行操作,一旦执行操作,就会调用target的sel方法
- (void)start;

注意:
默认情况下,操作对象在主线程中执行,调用了start方法后并不会 开一条新线程去执行操作,只有添加到队列中才会开启新的线程

 - 即默认情况下,如果操作没有放到队列中queue中,都是同步执行。

 - 只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

代码示例:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

  //创建操作对象,封装要执行的任务
  NSInvocationOperation *op =
      [[NSInvocationOperation alloc] initWithTarget:self
                                           selector:@selector(run)
                                             object:nil];
  //执行操作
  [op start];
}

- (void)run {
  NSLog(@"------%@", [NSThread currentThread]);
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}
@end

打印结果:

NSInvocationOperation[862:29437] ------{number = 1, name = main}

NSBlockOperation
//创建 NSBlockOperation 操作对象
+ (id)blockOperationWithBlock:(void (^)(void))block;

// 添加操作
- (void)addExecutionBlock:(void (^)(void))block;

注意:

只要 NSBlockOperation 封装的操作数 > 1,就会异步执行操作

代码示例:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

  // 1.创建 NSBlockOperation 操作对象
  NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
    // 在主线程
    NSLog(@"下载1------%@", [NSThread currentThread]);
  }];

  // 2.添加操作(额外的任务)(在子线程执行)
  [op addExecutionBlock:^{
    NSLog(@"下载2------%@", [NSThread currentThread]);
  }];

  [op addExecutionBlock:^{

  [op addExecutionBlock:^{
    NSLog(@"下载2------%@", [NSThread currentThread]);
  }];
  [op addExecutionBlock:^{
    NSLog(@"下载3------%@", [NSThread currentThread]);
  }];
  [op addExecutionBlock:^{
    NSLog(@"下载4------%@", [NSThread currentThread]);
  }];
  // 3.开启执行操作
  [op start];
}

- (void)run {
  NSLog(@"------%@", [NSThread currentThread]);
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

@end

打印结果:

NSBlockOperation[1013:37922] 下载1------{number = 1, name = main}
NSBlockOperation[1013:37952] 下载2------{number = 2, name = (null)}
NSBlockOperation[1013:37955] 下载3------{number = 3, name = (null)}
NSBlockOperation[1013:37951] 下载4------{number = 4, name = (null)}

本文源码 Demo 详见 Github
https://github.com/shorfng/iOS_4.0_multithreading.git





作者:蓝田(Loto)
出处:

如果你觉得本篇文章对你有所帮助,请点击文章末尾下方“喜欢”
如有疑问,请通过以下方式交流:
评论区回复微信(加好友请注明“+称呼”)发送邮件[email protected]



本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

你可能感兴趣的:(4.5 NSOperation->1.0 NSOperation简介)