簡(jiǎn)介
NSOperationQueue是一種面向?qū)ο蟮奶幚砭€程工作的技術(shù),在gcd 式的函數(shù)式編程上進(jìn)行的封裝,并聯(lián)合kvo 對(duì)一些狀態(tài)做了監(jiān)聽(tīng),同時(shí)加入了依賴(lài)等操作,使得開(kāi)發(fā)中在操作程序流程控制上更加省事。
NSOperation的操作類(lèi)
1. NSOperation
這個(gè)類(lèi)是用于定義自定義操作對(duì)象的基類(lèi),子類(lèi)化NSOperation可以完全控制您自己的操作的實(shí)現(xiàn),包括更改操作執(zhí)行的默認(rèn)方式并報(bào)告其狀態(tài)的能力。
2.NSInvocationOperation
一個(gè)你同時(shí)使用一個(gè)或多個(gè)block對(duì)象的類(lèi)。因?yàn)樗梢詧?zhí)行多個(gè)block,block操作對(duì)象使用組語(yǔ)義進(jìn)行操作; 只有當(dāng)所有關(guān)聯(lián)的block完成執(zhí)行時(shí),操作本身被認(rèn)為完成。
3.NSInvocationOperation
您根據(jù)應(yīng)用程序創(chuàng)建基于對(duì)象和選擇器的操作對(duì)象的類(lèi),簡(jiǎn)言之,類(lèi)似于UIbutton的target那種操作
所有操作對(duì)象都支持以下主要功能:
1,支持在操作對(duì)象之間建立基于圖形的依賴(lài)關(guān)系。這些依賴(lài)關(guān)系阻止給定的操作運(yùn)行,直到其所依賴(lài)的所有操作完成運(yùn)行
2,支持可選的completion block,該操作在操作的主要任務(wù)完成后執(zhí)行
3,支持優(yōu)先操作,從而影響其相對(duì)執(zhí)行順序 也就是支持操作的優(yōu)先級(jí)
4,支持 cancel setSuspended 等
5,支持使用KVO通知監(jiān)視對(duì)您的操作執(zhí)行狀態(tài)的更改,kvo監(jiān)聽(tīng)到你操作的進(jìn)程
創(chuàng)建Operation對(duì)象
1. 創(chuàng)建NSInvocationOperation對(duì)象
- (NSOperation*)taskWithData:(id)data {
NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(myTaskMethod:) object:data];
return theOp;
}
// This is the method that does the actual work of the task.
- (void)myTaskMethod:(id)data {
// Perform the task.
}
2.創(chuàng)建NSBlockOperation對(duì)象
NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
NSLog(@"Beginning operation.\n");
// Do some work.
}];
執(zhí)行Operations
到目前為止,執(zhí)行操作的最簡(jiǎn)單的方法是使用作為NSOperationQueue類(lèi)的一個(gè)實(shí)例的操作隊(duì)列。您的應(yīng)用程序負(fù)責(zé)創(chuàng)建和維護(hù)其打算使用的任何操作隊(duì)列。應(yīng)用程序可以具有任意數(shù)量的隊(duì)列,但是在給定時(shí)間點(diǎn)可能執(zhí)行多少操作有實(shí)際的限制。操作隊(duì)列與系統(tǒng)一起工作,將并發(fā)操作數(shù)限制為適用于可用內(nèi)核和系統(tǒng)負(fù)載的值。因此,創(chuàng)建其他隊(duì)列并不意味著您可以執(zhí)行其他操作。要?jiǎng)?chuàng)建一個(gè)隊(duì)列,您可以像應(yīng)用其他對(duì)象一樣在應(yīng)用程序中分配隊(duì)列:
NSOperationQueue * aQueue = [[NSOperationQueue alloc] init];//創(chuàng)建隊(duì)列
要將操作添加到隊(duì)列中,請(qǐng)使用該addOperation:方法。在OS X v10.6及更高版本中,您可以使用該addOperations:waitUntilFinished:方法添加一組操作,也可以使用該方法將塊對(duì)象直接添加到隊(duì)列中(不帶相應(yīng)的操作對(duì)象)addOperationWithBlock:。這些方法中的每一個(gè)都會(huì)排隊(duì)一個(gè)操作(或操作),并通知隊(duì)列應(yīng)該開(kāi)始處理它們。在大多數(shù)情況下,在添加到隊(duì)列后不久就會(huì)執(zhí)行操作,但由于幾個(gè)原因,操作隊(duì)列可能會(huì)延遲執(zhí)行排隊(duì)操作。具體來(lái)說(shuō),如果排隊(duì)操作依賴(lài)于尚未完成的其他操作,則可能會(huì)延遲執(zhí)行。如果運(yùn)行隊(duì)列本身被掛起或正在執(zhí)行其最大并發(fā)操作數(shù),則執(zhí)行也可能會(huì)被延遲。
// 把operation添加到隊(duì)列中 的三種方式
[aQueue addOperation:anOp]; //添加單個(gè)操作
[aQueue addOperations:anArrayOfOpswaitUntilFinished:NO]; //添加多個(gè)操作
[aQueue addOperationWithBlock:^ {
/* 做一點(diǎn)事。* /
}];
operation之間的依賴(lài)
1.當(dāng)某個(gè)NSOperation對(duì)象依賴(lài)于其它NSOperation對(duì)象的完成時(shí),就可以通過(guò)addDependency方法添加一個(gè)或者多個(gè)依賴(lài)的對(duì)象,只有所有依賴(lài)的對(duì)象都已經(jīng)完成操作,當(dāng)前NSOperation對(duì)象才會(huì)開(kāi)始執(zhí)行操作。注意:不要造成循環(huán)依賴(lài) 如果A依賴(lài)B, B依賴(lài)A 結(jié)果會(huì)是如何,你懂得。另外,通過(guò)removeDependency方法來(lái)刪除依賴(lài)對(duì)象。

D0F77D00-6964-4719-8634-51374B142F96.png

72B6D054-5DDE-431D-A491-E74B90064C9E.png
設(shè)置最大并發(fā)操作數(shù)
雖然NSOperationQueue該類(lèi)是為并行執(zhí)行操作而設(shè)計(jì)的,但是可以強(qiáng)制單個(gè)隊(duì)列一次只運(yùn)行一個(gè)操作。該setMaxConcurrentOperationCount:方法允許您配置操作隊(duì)列對(duì)象的最大并發(fā)操作數(shù)
[aQueue setMaxConcurrentOperationCount:1];//設(shè)置隊(duì)列的最大并發(fā)操作數(shù)量
取消操作 和 等待操作完成
[aQueue cancelAllOperations];//取消隊(duì)列里的所有操作
[operation1 cancel];//本操作取消
// 阻塞當(dāng)前線程,等待queue的所有操作執(zhí)行完畢
[queue waitUntilAllOperationsAreFinished];
本文只是記錄了簡(jiǎn)單的使用 介紹 可參考官方文檔https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1
可以看看AFN GCDAsyncSockcet 等三方庫(kù)中的應(yīng)用