NSOperationQueue的學(xué)習(xí)

簡(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)用

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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