相关概念
NSOperation是我们在开发中常用的多线程处理的手段之一,其实NSOperation是对GCD的包装,它的两个核心概念是【队列+操作】。
基本使用
NSOperation本身就是一个抽象类,只能使用它的子类,常用的三个子类分别是:NSBlockOperation、NSInvocationOperation以及自定义继承自NSOperation的类。通过利用NSOperation和NSOperationQueue结合使用实现多线程并发。
通过使用NSOperation来实现下载多张图片
- (void)downloadImage
{
//1.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//2.封装操作下载图片1
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/zhidao/pic/item/6a63f6246b600c3320b14bb3184c510fd8f9a185.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
//拿到图片数据
self.image1 = [UIImage imageWithData:data];
}];
//3.封装操作下载图片2
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSURL *url = [NSURL URLWithString:@"http://pic.58pic.com/58pic/13/87/82/27Q58PICYje_1024.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
//拿到图片数据
self.image2 = [UIImage imageWithData:data];
}];
//4.合成图片
NSBlockOperation *combine = [NSBlockOperation blockOperationWithBlock:^{
//4.1 开启图形上下文
UIGraphicsBeginImageContext(CGSizeMake(200, 200));
//4.2 画image1
[self.image1 drawInRect:CGRectMake(0, 0, 200, 100)];
//4.3 画image2
[self.image2 drawInRect:CGRectMake(0, 100, 200, 100)];
//4.4 根据图形上下文拿到图片数据
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
// NSLog(@"%@",image);
//4.5 关闭图形上下文
UIGraphicsEndImageContext();
//7.回到主线程刷新UI
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
self.imageView.image = image;
NSLog(@"刷新UI---%@",[NSThread currentThread]);
}];
}];
//5.设置操作依赖
[combine addDependency:op1];
[combine addDependency:op2];
//6.添加操作到队列中执行
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:combine];
}