1. 程式人生 > >iOS開發系列-NSOperation

iOS開發系列-NSOperation

control AD exe 封裝 概述 art ati task 分別是

概述

NSOperation是基於GCD的封裝更加面向對象,在使用上也是有任務跟隊列的概念,分別對應兩個類NSOperation 、NSOperationQueue

NSOperation和NSOperationQueue實現多線程的具體步驟

  • 現將需要執行的操作封裝到一個NSOperation對象中。
  • 然後將NSOperation對象添加到NSOperationQueue中
  • 系統會自動將NSOperationQueue中的NSOperation取出來
  • 將取出的NSOperation封裝的操作放到一條線程中執行

NSOperation

NSOperation是一個抽象類,使用時候需要使用其子類。NSOperation總共有兩個子類。

  • NSInvocationOperation
  • NSBlockOperation

開發中一般NSOperation子類通常與NSOperationQueue一起使用才能更好的開辟線程。

NSOperationQueue

NSOperation可以調用start方法類執行任務,但默認是同步的。如果將NSOperation添加到NSOperationQueue中執行,系統會自動異步執行NSOperation中的操作。

NSOperationQueue只用兩種類型,分別是主隊列跟非主隊列(包含串行、並發)。兩種隊列的獲取方式:

[NSOperationQueue mainQueue]; // 主隊類
[[NSOperationQueue alloc] init]; // 非主隊列

凡是添加到主隊列的任務都是在主線程中執行。非主隊列的任務會自動添加到子線程中執行。並發跟串行通過隊列的maxConcurrentOperationCount決定。

#import "ViewController.h"
@interface ViewController ()

@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task) object:nil];
    [queue addOperation:operation];
//    [operation start];
    
    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"------------%@", [NSThread currentThread]);
    }];
    // 添加額外的任務才會在子線程執行
    [blockOperation addExecutionBlock:^{
        NSLog(@"------------%@", [NSThread currentThread]);
    }];
    [queue addOperation:blockOperation];
    
//    [blockOperation start];
    
}

- (void)task
{
    NSLog(@"------------%@", [NSThread currentThread]);
}

一旦NSOperation添加進NSOperationQueue,無須調用NSOperation的start方法,內部自動回調用NSOperation的start。
技術分享圖片

開發中還可以自定義NSOperation的方式,重寫main方法將任務封裝進來。如果任務的代碼比較多,在很多程序的很多地方都需要使用,建議采用這種方式。

#import "FMOperation.h"

@implementation FMOperation
- (void)main
{
    // 封裝任務
    
}
@end

iOS開發系列-NSOperation