NSOperation和NSOperationQueue的使用

NSOperation和GCD是同樣的,也是蘋果提供給咱們的一套多線程解決方案。實際上它也是基於GCD開發的,可是比GCD擁有更強的可控性和代碼可讀性。安全

NSOperation是一個抽象的基類,表示一個獨立的計算單元,能夠爲子類提供有用且線程安全的創建狀態,優先級,依賴和取消等操做。
使用NSOperation有兩種方式:
①使用系統已經封裝好的NSBlockOperation和NSInvocationOperation這兩個實體類;
②繼承NSOperation,定製本身的操做。

1、簡單使用

①繼承NSOperation的MyOperation。多線程

MyOperation *operation = [[MyOperation alloc]init];
    //開始執行
    [operation start];
    //取消執行
    [operation cancel];
    //執行結束後調用的Block
    [operation setCompletionBlock:^{
        NSLog(@"執行結束");
    }];

② NSInvocationOperation使用方式和給Button添加事件類似,須要一個對象和一個Selector。NSInvocationOperation實際上是同步執行的,所以單獨使用的話,並無什麼做用。併發

NSInvocationOperation *invoOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];
[invoOperation start];

 

- (void)download {
    //執行操做
}

 ③NSBlockOperation支持併發的執行一個或多個block異步

NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        //執行操做
    }];
    
[blockOperation addExecutionBlock:^{
        //執行操做
    }];
    
[blockOperation addExecutionBlock:^{
        //執行操做
    }];

 2、NSOperationQueue

NSOperationQueue就是執行NSOperation的隊列,一般狀況下,是不會單獨使用上面的operation的,咱們會將一個或多個NSOperation對象放到隊列中去執行。這時NSInvocationOperation 和 NSBlockOperation都是異步執行的且都在子線程中執行。放入隊列中的NSOperation對象不須要調用start方法,NSOPerationQueue會在「合適」的時機自動調用。spa

NSInvocationOperation *invoOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];
[invoOperation start];
    
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        //執行操做
    }];
    
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//設置最大併發數
queue.maxConcurrentOperationCount = 1;
[queue addOperation:invoOperation];
[queue addOperation:blockOperation];

 注意:線程

1.設置queue的暫停只需設置屬性suspended爲YES或NO;code

2.取消能夠調用某個NSOperation的cancle方法,也能夠調用Queue的cancelAllOperations方法來取消所有線程;對象

3.所謂的暫停和取消並不會當即暫停或取消當前操做,而是不在調用新的NSOperation;blog

4.改變queue的maxConcurrentOperationCount能夠設置最大併發數。但最大併發數是有上限的,即便你設置爲1000,也不會超過其上限,而這個上限的數目也是由具體的運行環境決定的;繼承

5.設置最大併發數必定要在NSOperationQueue初始化後當即設置,由於被放到隊列中的NSOperation對象是由隊列本身決定什麼時候執行的,有可能你這邊一添加立馬就被執行。所以要想讓設置生效必定要在初始化後當即設置。

3、依賴關係 

假如A依賴於B,那麼A將會在B執行結束以後纔會執行。不要創建循環依賴,會形成死鎖,緣由同循環引用。

[invoOperation1 addDependency: invoOperation2];
相關文章
相關標籤/搜索