NSOperationQueue和NSOperation
NSOperation
- NSOperation類顶滩,在MVC中屬于M各拷,是用來封裝單個(gè)任務(wù)相關(guān)的代碼和數(shù)據(jù)的抽象類朦乏。
- 因?yàn)樗浅橄蟮纳龋荒軌蛑苯邮褂眠@個(gè)類投放,而是使用子類NSInvocationOperation或NSBlockOperation來實(shí)際執(zhí)行任務(wù)。
- NSOperation以及它的子類绒北,只是一個(gè)操作黎侈,本身無主線程和子線程之分∶朴危可在任意線程中使用峻汉,通常NSOperationQueue結(jié)合使用贴汪。
NSInvocationOperation
- NSInvocationOperation是NSOperation的子類。
- 封裝了執(zhí)行操作的target和要執(zhí)行的action休吠。
- 如果任務(wù)不在隊(duì)列中扳埂,那么就需要我們手動(dòng)啟動(dòng)任務(wù)。
使用NSInvocationOperation創(chuàng)建一個(gè)任務(wù)
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:self
selector:@selector(NSOperation) object:nil];
//手動(dòng)啟動(dòng)任務(wù)
[invocationOperation start];
NSBlockOperation
- NSBlockOperation是NSOperation的子類
- 封裝了需要執(zhí)行的代碼塊
- 如果任務(wù)不在隊(duì)列中蛛碌,那么就需要我們手動(dòng)啟動(dòng)任務(wù)聂喇。
使用NSBlockOperation創(chuàng)建一個(gè)任務(wù)
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"- ----block%@",[NSThread currentThread]);
}];
[blockOperation start];
NSOperationQueue
- NSOperationQueue是操作隊(duì)列,它用來管理一組NSOperation對(duì)象的執(zhí)行蔚携。
- 其中NSOperation可以調(diào)用它在隊(duì)列中的優(yōu)先級(jí)(使用addDependency:設(shè)置依賴關(guān)系)在我們希望某幾個(gè)任務(wù)執(zhí)行的時(shí)候有先后關(guān)系 希太,我們就可以為任務(wù)添加依賴。不能互相添加依賴酝蜒。
- 通過設(shè)置最大并發(fā)數(shù)誊辉,讓一組任務(wù)可以有序的執(zhí)行 。最大并發(fā)數(shù)的默認(rèn)值為-1亡脑,意思為無限個(gè)堕澄。當(dāng)最大并發(fā)數(shù)設(shè)置為1的時(shí)候可以讓一組任務(wù)可以有序的執(zhí)行。
- NSOperationQueue操作隊(duì)列霉咨,實(shí)現(xiàn)多線程的一種技術(shù)手段蛙紫,thread需要我們手動(dòng)的去管理內(nèi)存,隊(duì)列不需要途戒。thread每次只能開辟一個(gè)子線程坑傅,隊(duì)列可以調(diào)度,分配喷斋、管理多個(gè)線程唁毒。
- NSOperationQueue隊(duì)列有兩種,一種是其他隊(duì)列星爪,一種是主隊(duì)列浆西。獲取主隊(duì)列的任務(wù)都是在主線程中執(zhí)行的,其他隊(duì)列中的任務(wù)都是在子線程中執(zhí)行的顽腾。
NSOperationQueue主隊(duì)列
創(chuàng)建任務(wù)并將任務(wù)添加進(jìn)主隊(duì)列中
示例代碼
- (void)mainQienestudy{
NSOperationQueue *mainQuene = [NSOperationQueue mainQueue];
NSBlockOperation *bloskOperation_0 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1--------%@",[NSThread currentThread]);
}];
NSBlockOperation *bloskOperation_1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2--------%@",[NSThread currentThread]);
}];
NSBlockOperation *bloskOperation_2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"3--------%@",[NSThread currentThread]);
}];
//將任務(wù)添加到主隊(duì)列中
[mainQuene addOperation:bloskOperation_0];
[mainQuene addOperation:bloskOperation_1];
[mainQuene addOperation:bloskOperation_2];
}
NSOperationQueue其他隊(duì)列
創(chuàng)建任務(wù)并將任務(wù)添加進(jìn)其他隊(duì)列中
示例代碼
- (void)OperationQueueStudy{
//創(chuàng)建一個(gè)其他隊(duì)列近零,通過初始化方式創(chuàng)建的隊(duì)列只能是其他隊(duì)列
NSOperationQueue *OtherQuene = [[NSOperationQueue alloc]init];
//隊(duì)列中只能添加任務(wù)
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@1",[NSThread currentThread]);
}];
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@2",[NSThread currentThread]);
}];
NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@3",[NSThread currentThread]);
}];
NSBlockOperation *blockOperation4 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@4",[NSThread currentThread]);
}];
NSBlockOperation *blockOperation5 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@5",[NSThread currentThread]);
}];
//希望某幾個(gè)任務(wù)執(zhí)行的時(shí)候有先后關(guān)系 ,我們就可以為任務(wù)添加依賴崔泵。不能互相添加依賴秒赤。
// [blockOperation1 addDependency:blockOperation5];
//通過設(shè)置最大并發(fā)數(shù),讓一組任務(wù)可以有序的執(zhí)行 憎瘸。最大并發(fā)數(shù)的默認(rèn)值為-1,意思為無限個(gè)陈瘦。
OtherQuene.maxConcurrentOperationCount = 1;
//將任務(wù)添加到隊(duì)列,在隊(duì)列中的任務(wù)不需要手動(dòng)啟動(dòng)幌甘。
[OtherQuene addOperation:blockOperation1];
[OtherQuene addOperation:blockOperation2];
[OtherQuene addOperation:blockOperation3];
[OtherQuene addOperation:blockOperation4];
[OtherQuene addOperation:blockOperation5];
}
總結(jié)
只要是添加進(jìn)主隊(duì)列的任務(wù),一定是在主線程中進(jìn)行的,不管這個(gè)主隊(duì)列出現(xiàn)在哪里锅风。所以這也是一種從子隊(duì)列返回主隊(duì)列的方法酥诽,我們只需要在要返回主線程的子線程使用這個(gè)方法,就可以返回主隊(duì)列皱埠。