天天看點

iOS-NSOperation多線程程式設計詳解

iOS-多線程程式設計之NSOperation使用詳解

前面一篇文章中說到NSThread的多線程的實作,在說NSOperation多線程程式設計之前,先來對它們進行比較:

一.NSThread 與 NSOperation的比較

1.NSThread建立一個執行個體變量就是一個線程,相當于手動的建立了一個線程并擁有線程的入口函數,NSOperation建立一個執行個體隻是建立了一個運作任務,并沒有建立一個線程,隻有把它放到一個NSOperationQueque線程隊列中,當運作到它的時候就會有一個線程運作NSOperation的任務;前者的任務執行線程是開發者建立,而後者的任務執行線程為負責運作NSOperationQueque隊列中的線程池運作,NSOperationQueue隻是一個容器,具體的執行線程由app官方實作,這樣就省掉了多線程程式設計中的線程管理,交給系統或者架構管理,對比說明如下圖

iOS-NSOperation多線程程式設計詳解

二.NSOperation頭檔案代碼分析

NSOperation是一個抽象的類,開發者可以通過子類化來實作多線程的程式設計;

- (void)start;        //手動啟動并執行該任務操作,其本質是把改Operation添加到系統定義的NS OperationQueue中,該操作隊列是[NSOperationQueue mainqueue],優先級别高,可優先執行

- (void)main;//該操作的入口函數相當于線程的入口函數,應用程式的main函數,你想多線程執行的任務一般都放到該函數中

@property (readonly,getter=isCancelled) BOOL cancelled;  //狀态的判斷

- (void)cancel;//撤銷該操作

@property (readonly,getter=isExecuting) BOOL executing;    //執行狀态判斷

@property (readonly,getter=isFinished) BOOL finished;//判斷是否執行完成

@property (readonly,getter=isAsynchronous) BOOL asynchronous    //表示是不是異步操作

@property (readonly,getter=isReady) BOOL ready;     //執行準備狀态判斷

- (void)addDependency:(NSOperation *)op;    //添加依賴的NSOperation,也就是改操作的執行要依賴op,隻有op執行完成了才執行自己的操作

- (void)removeDependency:(NSOperation *)op;   //清除依賴操作

@property (readonly,copy) NSArray *dependencies;//可讀屬性通過該屬性可以得到該操作的依賴操作數組

@property NSOperationQueuePriority queuePriority;        //操作隊列的優先級,優先級别越高,任務獲得的執行時間片久越多

@property (copy)void (^completionBlock)(void)  //當該操作執行完成之後要執行的操作可以寫到該block中

三.系統提供了兩個NSOperation的子類,NSBlockOperation 和NSInvocationOperation

1.NSBlockOperation

NSBlockOperation *blk = [NSBlockOperationblockOperationWithBlock:^{

         NSLog(@"你好,我是NSBlockOperation");

     }]; //建立一個BlockOperation,此時該操作并未執行,

[blk start] //通過手動的啟動,該block就被執行了,啟動方法一

[[NSOperationQueuemainQueue] addOperation:blk]; //通過把blk添加到操作隊列中,當隊列運作到blk, 它就會調用該blk的啟動操作 啟動方法二

//兩種啟動方法都可以啟動

blk.completionBlock =^{

        NSLog(@"你好,我時completionBlock");

    }; //給completionBlock是該操作執行完成之後就會執行的任務

小結:Block是線程的執行指令,啟動兩種方法可以任選其一

運作結果:

2014-12-29 23:33:16.701 gcd[766:36714]你好,我是NSBlockOperation

2014-12-29 23:33:16.702 gcd[766:36745]你好,我時completionBlock

2.NSInvocationOperation

NSInvocationOperation *invctOpt = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(operationSelect:)object:nil];

    [invctOptstart]; //operationSelect:是operation的執行入口,其功能和NSBlockOperation的block,使用者可以指定執行self或者其他執行個體對象中的operation Select:方法作為NSInvocationOperation的執行任務入口

3.NSOperation 的子類化

#import "MyOperation.h"

@implementation MyOperation
-(void)main{
    NSLog(@"你好,我是子類化的operation");
}
@end
           

子類化的operation使用

MyOperation *my = [[MyOperation alloc]init];
    [my start];
           

4.小結

不管你用什麼方法使用operation你手動的start它會預設的添加到NSOperationQueue Main Queue中并執行,自然它是在主線程上執行,如果想不再主線程上執行就自己建立一個queue,并把operation丢到裡面去,NSOperation和NSThread的用法非常相似,可以說NS Operation把多線程的任務重NSThread分離出來,這樣在使用NSOperation實作多線程任務時就可以不用維護線程的任務,而是把線程的任務交給系統或者架構,在程式設計時可以通過

[NSOperationQueue currentQueue]來得到操作的隊列,進而可以控制最大的并發量,

 通過suspended來設定挂起狀态,

- (void)cancelAllOperations這個函數是用來取消所有的操作,

轉載于:https://www.cnblogs.com/fanyiyao-980404514/p/4207425.html