NSOperation是Objc语言的,底层实现基于GCD,线程的生命周期不需要程序员管理。要配合NSOperationQueue一起使用。
NSOperation的使用步骤
- 1.将要执行的操作放到NSOperation对象中
- 2.将NSOperation放到NSOperationQueue中,即操作放到队列中。
- 3.系统会自动将NSOperationQueue中的NSOperation取出来开启新的线程进行执行
NSOperation是一个抽象类,不能被实例化,只能实例化它的子类
- 1.使用子类NSInvocationOperation
- 2.使用子类NSBlockOperation
- 3.自定义类继承NSOperation,实现main方法。
NSInvocationOperation的使用
- 在viewDidLoad中编写代码如下
- (void)viewDidLoad
{
[super viewDidLoad];
// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 创建操作
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];
// 添加操作到队列中,会自动异步执行
[queue addOperation:operation];
}
- download方法实现:
- (void)download
{
NSLog(@"download-----%@", [NSThread currentThread]);
}
NSBlockOperation
- 在viewDidLoad中编辑代码如下
- (void)viewDidLoad
{
[super viewDidLoad];
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"---下载图片----1---%@", [NSThread currentThread]);
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"---下载图片----2---%@", [NSThread currentThread]);
}];
NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"---下载图片----3---%@", [NSThread currentThread]);
}];
NSBlockOperation *operation4 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"---下载图片----4---%@", [NSThread currentThread]);
}];
// 1.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 2.添加操作到队列中(自动异步执行)
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
[queue addOperation:operation4];
}
- NSBlockOperation是讲操作以block的形式封装起来,然后将操作对象放到队列中异步执行。
NSOperation是基于GCD的Objc封装,不仅拥有所有GCD的功能,还拥有一些其他用法。
- 1.设置最大并发数量,即同时执行的任务数。通过调用NSOperation对象的
setMaxConcurrentOperationCount
来实现。 - 2.队列的取消,暂停,恢复
- 3.添加到队列中的操作可以设置执行的优先级
- 4.操作之间可以设置依赖,一个操作的执行依赖于其他操作的完成。
- 请看示例代码
- (void)dependency
{
/**
假设有A、B、C三个操作,要求:
1. 3个操作都异步执行
2. 操作C依赖于操作B
3. 操作B依赖于操作A
*/
// 1.创建一个队列(非主队列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 2.创建3个操作
NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"A1---%@", [NSThread currentThread]);
}];
NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"B---%@", [NSThread currentThread]);
}];
NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"C---%@", [NSThread currentThread]);
}];
// 设置依赖
[operationB addDependency:operationA];
[operationC addDependency:operationB];
// 3.添加操作到队列中(自动异步执行任务)
[queue addOperation:operationC];
[queue addOperation:operationA];
[queue addOperation:operationB];
}
NSOperation方式的线程间通信
- 在前几篇文章中讲了NSThread,GCD方式的线程间通信。下面通过NSOperation的方式进行线程之间的通信。
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
// 1.异步下载图片
NSURL *url = [NSURL URLWithString:@"http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
// 2.回到主线程,显示图片
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = image;
}];
}];
通过[NSOperationQueue mainQueue]
的方式拿到主线程,通过block将操作封装到主线程中进行操作。
网友评论