iOS併發機制(三) —— NSOperation實現多併發之建立佇列和開啟執行緒

b10l07發表於2017-08-16

版本記錄

版本號 時間
V1.0 2017.08.16

前言

訊號量機制是多執行緒通訊中的比較重要的一部分,對於NSOperation可以設定併發數,但是對於GCD就不能設定併發數了,那麼就只能靠訊號量機制了。接下來這幾篇就會詳細的說一下併發機制。感興趣的可以看這幾篇文章。
1. ios併發機制(一) —— GCD中的訊號量及幾個重要函式
2.ios併發機制(二) —— NSOperation實現多併發之建立任務

佇列的建立

上一篇主要講了NSOperation API介面以及建立任務的方法,下面就說一下佇列的建立方法。NSOperationQueue可以分為兩種佇列,主佇列和其他佇列,其他佇列裡面還可以實現序列和併發功能。

  • 主佇列:新增到主佇列中的任務都會放在主執行緒中執行。
NSOperationQueue *queue = [NSOperationQueue mainQueue];
  • 其他佇列:新增到其他佇列中的任務都會放在子執行緒中執行。
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

新增任務到佇列

下面我們就看一下新增任務到佇列。

方法1

可以使用方法- (void)addOperation:(NSOperation *)op;

下面還是看程式碼。

#import "JJOperationQueueVC.h"

@interface JJOperationQueueVC ()

@end

@implementation JJOperationQueueVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    //建立佇列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    //建立任務,你也可以使用NSInvocationOperation,我這裡就只用NSBlockOperation做個例子了
    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"blockOperation");
        NSLog(@"thread = %@",[NSThread currentThread]);
    }];
    
    [queue addOperation:blockOperation];
}

@end

看輸出結果

2017-08-16 17:36:13.590386+0800 JJOC[10142:4509963] blockOperation
2017-08-16 17:36:13.590538+0800 JJOC[10142:4509963] thread = <NSThread: 0x17407ff40>{number = 4, name = (null)}

可以發現開啟了新的執行緒,同時將任務放在佇列裡面,任務就會立即執行,不同呼叫其他方法才開始執行。

方法2

使用- (void)addOperationWithBlock:(void (^)(void))block NS_AVAILABLE(10_6, 4_0);

還是直接看程式碼。

#import "JJOperationQueueVC.h"

@interface JJOperationQueueVC ()

@end

@implementation JJOperationQueueVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    //建立佇列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    [queue addOperationWithBlock:^{
        NSLog(@"blockOperation");
        NSLog(@"thread = %@",[NSThread currentThread]);
    }];
}

@end

下面看輸出結果

2017-08-16 17:38:32.428260+0800 JJOC[10146:4510462] blockOperation
2017-08-16 17:38:32.428661+0800 JJOC[10146:4510462] thread = <NSThread: 0x170075a00>{number = 4, name = (null)}

可見也開啟了一個新的執行緒。

後記

未完,待續~~~

3691932-90e050e10e744f7f.jpg

相關文章