1.Nsopreation的作用:
配合nsopreation和nsopreationqueue也能實(shí)現(xiàn)多線程編程
2.實(shí)現(xiàn)多線程的步驟:
1.將需要執(zhí)行的操作,封裝到nsopreation對(duì)象中
2.然后將nsopreation對(duì)象添加到nsopreationqueue中
3.系統(tǒng)會(huì)自動(dòng)取出nsopreation和nsopreationqueue
4.將取出的nsopreation封裝的操作放到一條新線程中執(zhí)行。
3.Nsopreation的子類:
Nsopreation是個(gè)抽象類,并不具備封裝操作的能力,必須使用他的子類
4.使用nsopreation子類的方法有三種:
NSInvocationOperation
NSBlockOperation
自定義nsoperation

NSBlockOperation:

5.NSOperation:
主隊(duì)列:[NSOperation MainQueue]和gcd中的主隊(duì)列是一樣的,是串行隊(duì)列。
非主隊(duì)列:[NSOperation alloc]init];非主隊(duì)列同時(shí)具備并發(fā)和串行的功能。
默認(rèn)情況下,非主隊(duì)列是并發(fā)隊(duì)列。
//將操作放到隊(duì)列中,實(shí)現(xiàn)多線程


6.自定義NSOperation
創(chuàng)建一個(gè)類,繼承nsthread,然后在這個(gè)類的.m文件中重寫main方法,告知要執(zhí)行的任務(wù)代碼。
自定義的好處:1.有利于代碼的隱藏2.有利于代碼的復(fù)用

6.NSOperation的其他方法
1.設(shè)置最大并發(fā)數(shù)maxConcurrentOperationCount
2.根據(jù)這個(gè)屬性,可以控制是并行隊(duì)列還是串行隊(duì)列。
3.如果一個(gè)隊(duì)列事并發(fā)隊(duì)列,開啟了子線程。同一時(shí)間有多個(gè)操作在執(zhí)行。最大并發(fā)數(shù):指的是同一時(shí)間最多有多少個(gè)任務(wù)在執(zhí)行,控制同一時(shí)間任務(wù)執(zhí)行的任務(wù)數(shù)量。默認(rèn)不受控制/設(shè)置為0,不能執(zhí)行任務(wù)。如果設(shè)置為1,則是串行任務(wù)
4.串行執(zhí)行任務(wù)不等于只開一條線程
5.如果maxConcurrentOperationCount >1,并發(fā)隊(duì)列
maxConcurrentOperationCount=1串行隊(duì)列
maxConcurrentOperationCount =0任務(wù)不會(huì)執(zhí)行
maxConcurrentOperationCount =-1,特殊意義:表示最大值。表示隊(duì)列的最大并發(fā)數(shù)不受限制。


對(duì)于自定義nsopreation,系統(tǒng)的canlcle等方法都不管用。建議在重寫main方法的時(shí)候添加:

7.nsopreation 實(shí)現(xiàn)依賴和監(jiān)聽。
1.操作依賴:

2.操作監(jiān)聽

8.nsopreation實(shí)現(xiàn)線程見的通信

9.案例,用nsopreation的方法實(shí)現(xiàn)兩張圖片下載完成后合成一張圖片。(考慮用依賴關(guān)系。合成圖片的線程操作要依賴于兩個(gè)下載圖片的操作)附上代碼
//案例2。下載兩張圖片。下載完以后合并圖片。用nsopreation實(shí)現(xiàn)..可以用依賴關(guān)系實(shí)現(xiàn)
-(void)downloadsimages{
//1.創(chuàng)建隊(duì)列
NSOperationQueue*queue = [[NSOperationQueuealloc]init];
__blockUIImage*image1;
__blockUIImage*image2;
//2封裝操作,下載圖片1
NSBlockOperation*download1 = [NSBlockOperationblockOperationWithBlock:^{
NSURL*url = [NSURLURLWithString:@"http://s15.sinaimg.cn/bmiddle/4c0b78455061c1b7f1d0e"];
NSData*imageData = [NSDatadataWithContentsOfURL:url];
image1 = [UIImageimageWithData:imageData];
NSLog(@"download---%@",[NSThreadcurrentThread]);
}];
//3封裝操作,下載圖片2
NSBlockOperation*download2 = [NSBlockOperationblockOperationWithBlock:^{
NSURL*url = [NSURLURLWithString:@"http://www.027art.com/feizhuliu/UploadFiles_6650/201109/2011091718442835.jpg"];
NSData*imageData = [NSDatadataWithContentsOfURL:url];
image2 = [UIImageimageWithData:imageData];
NSLog(@"download---%@",[NSThreadcurrentThread]);
}];//4.封裝合并圖片的操作
NSBlockOperation*combie = [NSBlockOperationblockOperationWithBlock:^{
//4.1開上下文
UIGraphicsBeginImageContext(CGSizeMake(200,200));
//4.2畫圖1
[image1drawInRect:CGRectMake(0,0,100,200)];
//4.3畫圖2
[image2drawInRect:CGRectMake(100,0,100,200)];
//4.4根據(jù)上下文得到圖片
UIImage*image =UIGraphicsGetImageFromCurrentImageContext();
//4.5關(guān)閉上下文
UIGraphicsEndImageContext();
//7.更新UI
[[NSOperationQueuemainQueue]addOperationWithBlock:^{
self.imageVieww.image= image;
NSLog(@"UI----%@",[NSThreadcurrentThread]);
}];
}];
//5.設(shè)置依賴合成圖片的操作需要依賴download 1,2
[combieaddDependency:download1];
[combieaddDependency:download2];
//6.添加操作到隊(duì)列中
[queueaddOperation:download1];
[queueaddOperation:download2];
[queueaddOperation:combie];
}