相關(guān)概念
NSOperation是我們?cè)陂_發(fā)中常用的多線程處理的手段之一蔑水,其實(shí)NSOperation是對(duì)GCD的包裝肤粱,它的兩個(gè)核心概念是【隊(duì)列+操作】领曼。
基本使用
NSOperation本身就是一個(gè)抽象類蛮穿,只能使用它的子類,常用的三個(gè)子類分別是:NSBlockOperation单刁、NSInvocationOperation以及自定義繼承自NSOperation的類府适。通過利用NSOperation和NSOperationQueue結(jié)合使用實(shí)現(xiàn)多線程并發(fā)檐春。
通過使用NSOperation來實(shí)現(xiàn)下載多張圖片
- (void)downloadImage
{
//1.創(chuàng)建隊(duì)列
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];
//拿到圖片數(shù)據(jù)
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];
//拿到圖片數(shù)據(jù)
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 根據(jù)圖形上下文拿到圖片數(shù)據(jù)
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
// NSLog(@"%@",image);
//4.5 關(guān)閉圖形上下文
UIGraphicsEndImageContext();
//7.回到主線程刷新UI
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
self.imageView.image = image;
NSLog(@"刷新UI---%@",[NSThread currentThread]);
}];
}];
//5.設(shè)置操作依賴
[combine addDependency:op1];
[combine addDependency:op2];
//6.添加操作到隊(duì)列中執(zhí)行
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:combine];
}