iOS開發實踐之多線程(NSOperation)

來源:互聯網
上載者:User

iOS開發實踐之多線程(NSOperation)

NSOperation 封裝了GCD(底層),使用更加物件導向化。

NSOperation的作用

配合使用NSOperation和NSOperationQueue也能實現多線程編程。

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

1、先將需要執行的操作封裝到一個NSOperation對象中。

2、然後將NSOperation對象添加到NSOperationQueue中。

3、系統會自動將NSOperationQueue中的NSOperation取出來。

4、將取出的NSOperation封裝的操作放到一條新線程中執行。

NSOperation是個抽象類別,並不具備封裝操作的能力,必須使用它的子類

1、NSInvocationOperation

1.1、建立NSInvocationOperation對象

- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;

1.2、注意:

預設情況下,調用了start方法後並不會開一條新線程去執行操作,而是在當前線程同步執行操作

只有將NSOperation放到一個NSOperationQueue中,才會非同步執行操作

- (void)viewDidLoad {    [super viewDidLoad];        //建立隊列    NSOperationQueue *queue = [[NSOperationQueue alloc]init];    //建立操作    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download) object:nil];    // operation直接調用start,是同步執行(在當前線程執行操作)    //[operation start];        //添加操作到隊列中,會異自動步執行    [queue addOperation:operation];}

2、NSBlockOperation

2.1、建立NSBlockOperation對象

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

2.2、通過addExecutionBlock:方法添加更多的操作

- (void)addExecutionBlock:(void (^)(void))block;

2.3、注意:只要NSBlockOperation封裝的運算元> 1,就會非同步執行操作

-(void)viewDidLoad{    [super viewDidLoad];        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"---下載圖片----1---%@", [NSThread currentThread]);    }];        [operation addExecutionBlock:^{        NSLog(@"---下載圖片----2---%@", [NSThread currentThread]);    }];        [operation addExecutionBlock:^{        NSLog(@"---下載圖片----3---%@", [NSThread currentThread]);    }];        // 任務數量 > 1,才會開始非同步執行    [operation start];}
- (void)viewDidLoad {    [super viewDidLoad];        NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{         NSLog(@"---下載圖片----1---%@", [NSThread currentThread]);    }];        NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{         NSLog(@"---下載圖片----2---%@", [NSThread currentThread]);    }];        NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{         NSLog(@"---下載圖片----3---%@", [NSThread currentThread]);    }];        // 1.建立隊列    NSOperationQueue *queue = [[NSOperationQueue alloc]init];    //建立主隊列,操作添加到主隊列中會同步串列執行    //NSOperationQueue *queue = [NSOperationQueue mainQueue];        // 2.添加操作到隊列中(自動非同步執行)    [queue addOperation:operation1];    [queue addOperation:operation2];    [queue addOperation:operation3];    }

3、自訂子類繼承NSOperation,實現內部相應的方法。

自訂NSOperation的步驟:

重寫- (void)main方法,在裡面實現想執行的任務

重寫- (void)main方法的注意點

自己建立自動釋放池(因為如果是非同步作業,無法訪問主線程的自動釋放池)

經常通過- (BOOL)isCancelled方法檢測操作是否被取消,對取消做出響應

NSOperationQueue

1、NSOperationQueue的作用:NSOperation可以調用start方法來執行任務,但預設是同步執行的。如果將NSOperation添加到NSOperationQueue(操作隊列)中,系統會自動非同步執行NSOperation中的操作。

2、添加操作到NSOperationQueue中:

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

- (void)addOperationWithBlock:(void (^)(void))block;

- (void)viewDidLoad{    [super viewDidLoad];        NSOperationQueue *queue = [[NSOperationQueue alloc]init];    [queue addOperationWithBlock:^{        NSLog(@"下載圖片-----%@",[NSThread currentThread]);    }];    }
3、最大並發數

是並發數是指同時執行的任務數。比如,同時開3個線程執行3個任務,並發數就是3

最大並發數的相關方法

- (NSInteger)maxConcurrentOperationCount;

- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;

- (void)viewDidLoad{    [super viewDidLoad];            // 1.建立一個隊列(非主隊列)    NSOperationQueue *queue = [[NSOperationQueue alloc] init];        // 2.設定最大並發(最多同時並發執行3個任務)    queue.maxConcurrentOperationCount = 3;        // 3.添加操作到隊列中(自動非同步執行任務,並發)    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"下載圖片1---%@", [NSThread currentThread]);    }];    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"下載圖片2---%@", [NSThread currentThread]);    }];    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"下載圖片3---%@", [NSThread currentThread]);    }];    NSBlockOperation *operation4 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"下載圖片4---%@", [NSThread currentThread]);    }];    NSInvocationOperation *operation5 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];        [queue addOperation:operation1];    [queue addOperation:operation2];    [queue addOperation:operation3];    [queue addOperation:operation4];    [queue addOperation:operation5];    }
4、操作依賴

NSOperation之間可以設定依賴來保證執行順序

比如一定要讓操作A執行完後,才能執行操作B,可以這麼寫

[operationB addDependency:operationA];// 操作B依賴於操作A

可以在不同queue的NSOperation之間建立依賴關係。但是,注意:不能相互依賴比如A依賴B,B依賴A


- (void)viewDidLoad{    [super viewDidLoad];    /**     假設有A、B、C三個操作,要求:     1. 3個操作都非同步執行     2. 操作C依賴於操作B     3. 操作B依賴於操作A     */        // 1.建立一個隊列(非主隊列)    NSOperationQueue *queue = [[NSOperationQueue alloc] init];        // 2.建立3個操作    NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"A1---%@", [NSThread currentThread]);    }];        NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"B---%@", [NSThread currentThread]);    }];    NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"C---%@", [NSThread currentThread]);    }];        // 設定依賴    [operationB addDependency:operationA];    [operationC addDependency:operationB];        // 3.添加操作到隊列中(自動非同步執行任務)    [queue addOperation:operationC];    [queue addOperation:operationA];    [queue addOperation:operationB];    }
5、隊列的取消、暫停、恢複

5.1、取消隊列的所有操作

- (void)cancelAllOperations;

提示:也可以調用NSOperation的- (void)cancel方法取消單個操作

5.2、暫停和恢複隊列

- (void)setSuspended:(BOOL)b;// YES代表暫停隊列,NO代表恢複隊列

- (BOOL)isSuspended;

6.操作優先順序

設定NSOperation在queue中的優先順序,可以改變操作的執行優先順序

- (NSOperationQueuePriority)queuePriority;

- (void)setQueuePriority:(NSOperationQueuePriority)p;

優先順序的取值

NSOperationQueuePriorityVeryLow = -8L,

NSOperationQueuePriorityLow = -4L,

NSOperationQueuePriorityNormal = 0,

NSOperationQueuePriorityHigh = 4,

NSOperationQueuePriorityVeryHigh = 8

7、操作的監聽

可以監聽一個操作的執行完畢

- (void (^)(void))completionBlock;

- (void)setCompletionBlock:(void (^)(void))block;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.