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

二.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