iOS之[多線程:NSOperation]

1. NSOperation

:fa-exclamation-triangle:如下是你須要考慮使用 NSOperation 的一些理由:併發

1.當你須要取消線程任務時,GCD 沒法提供取消任務的操做。而 NSOperation 提供了取消任務的操做;異步

2.當你須要更細的粒度地觀察任務改變了狀態時,因爲 NSOperation 是一個對象,比較 GCD 使用的 block 而言,經過對 NSOperation 對象進行鍵值觀察(KVO)能很容易觀察到任務的狀態改變;spa

3.當你須要重用線程任務時,NSOperation 做爲一個普通的 Objective-C 對象,能夠存儲任何信息。對象就是爲重用而設計的,這時,NSOperation 比 GCD 使用的 block 要更方便。.net

1.1 NSOperation簡介

實際開發中使用的是NSOperation的兩個子類線程

- NSInvocationOperation
    - NSBlockOperation        :使用block形式組織代碼,相對方便
1.2 線程的建立執行過程
異步:建立NSOperation -> 建立NSOperationQueue隊列 -> 將NSOperation添加到Queue中

同步:建立NSOperation -> 調用start方法
1.3 線程狀態
isReady     :準備就緒 -> 只讀(有線程依賴時可能爲NO)
isExecuting :正在執行 -> 只讀
isFinished  :執行完了 -> 只讀
isCancelld  :已經取消 -> 能夠手動干預:調用cancel()方法
    - 只是設置隊列狀態,並非真正的中止當前隊列
1.4線程優先級:queuePriority

線程優先級分爲5個級別設計

@property double threadPriority; //IOS8已廢棄
@property NSOperationQueuePriority queuePriority;

typedef NS_ENUM(NSInteger, NSOperationQueuePriority) {
	NSOperationQueuePriorityVeryLow = -8L,
	NSOperationQueuePriorityLow = -4L,
	NSOperationQueuePriorityNormal = 0,
	NSOperationQueuePriorityHigh = 4,
	NSOperationQueuePriorityVeryHigh = 8
};
1.5設置依賴線程

A依賴於B:B執行完以後,才能執行A 添加依賴code

- (void)addDependency:(NSOperation *)op;

刪除依賴orm

- (void)removeDependency:(NSOperation *)op;
1.6 添加執行完畢監聽
operation.completionBlock = ^(){
    //執行完畢
};

- (void)waitUntilFinished;

2.NSOperationQueue

  • 負責管理/執行全部的NSOperation對象

  • 可以更加容易的管理線程總數,控制線程之間的依賴關係blog

2.1在隊列中添加操做
- (void)addOperation:(NSOperation *)op;

- (void)addOperations:(NSArray<NSOperation *> *)ops waitUntilFinished:(BOOL)wait;

- (void)addOperationWithBlock:(void (^)(void))block;
2.2設置最大線程數
queue.maxConcurrentOperationCount = ?
2.3取消隊列中全部線程
- (void)cancelAllOperations;
2.4執行完了監聽
- (void)waitUntilAllOperationsAreFinished;
2.5調用主線程隊列:更新UI
[[NSOperationQueue mainQueue] addOperation...];

3.NSInvocationOperation

建立線程:

- (instancetype)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;
- (instancetype)initWithInvocation:(NSInvocation *)inv;

例子:

//建立操做
NSInvocationOperation *invocationOpr = 
        [[NSInvocationOperation alloc] initWithTarget:self 
                                             selector:@selector(load) 
                                               object:nil];

//建立隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//添加到隊列,隊列回開啓一個線程執行此操做
[queue addOperation : invocationOpr];

4.NSBlockOperation

建立線程

+ (instancetype)blockOperationWithBlock:(void (^)(void))block;

//在已有的線程的基礎上,添加其餘線程:併發
- (void)addExecutionBlock:(void (^)(void))block;

例子:

方法一:建立操做並添加到隊列
    NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
        
    }];

    //建立隊列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    //添加到隊列
    [queue addOperation : block];

方法二:直接添加操做到隊列
    //建立隊列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [queue addOperationWithBlock:^{
        
    }];

=========================================================

其餘線程方式:

NSThread http://my.oschina.net/u/2462423/blog/534210

GCD:Dispatch http://my.oschina.net/u/2462423/blog/534159

相關文章
相關標籤/搜索