NSOperation相關(guān)

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


1.NSInvocationOperation

NSBlockOperation:

2.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)多線程


3.NSInvocationOperation實(shí)現(xiàn)多線程


4.NSBlockOperation實(shí)現(xiàn)多線程

6.自定義NSOperation

創(chuàng)建一個(gè)類,繼承nsthread,然后在這個(gè)類的.m文件中重寫main方法,告知要執(zhí)行的任務(wù)代碼。

自定義的好處:1.有利于代碼的隱藏2.有利于代碼的復(fù)用

5.

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)聽

監(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];

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容