02-dispatch_barrier

葉喬木發表於2018-12-14

1 dispatch_barrier_async 概念

柵欄方法,暫時的將一部操作做成一個同步操作,向一個柵欄一樣的分開

dispatch_barrier_async函式的作用是在程式管理中起到一個柵欄的作用,它等待所有位於barrier函式之前的操作執行完畢後執行,並且在barrier函式執行之後,barrier函式之後的操作才會得到執行,該函式需要同dispatch_queue_create函式生成的concurrent Dispatch Queue佇列一起使用

2 作用

1.實現高效率的資料庫訪問和檔案訪問

2.避免資料競爭

3 注意點:

  1. 佇列一定不能是全域性佇列(dispatch_get_global_queue)
  2. 使用自己建立的併發佇列(dispatch_queue_create(“read_write_queue”, DISPATCH_QUEUE_CONCURRENT);)
  3. 函式必須為asyn

在前面的任務執行結束後它(柵欄函式)才執行,而且它後面的任務等它執行完成之後才會執行(它前面任務順序不能控制,它後面的順序也不能控制)

4 使用

  • 不使用柵欄方法
#import "ViewController.h"

@interface ViewController ()
{
    dispatch_queue_t _queue;
    
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    _queue = dispatch_queue_create("read_write_queue", DISPATCH_QUEUE_CONCURRENT);
    [self read];
    [self read];
    [self write];
}
- (void)read{
    //
    dispatch_async(_queue, ^{
        sleep(1);
        NSLog(@"read");
    });
}
- (void)write
{
    dispatch_async(_queue, ^{
        sleep(1);
        NSLog(@"write");
    });
}

@end
    
// 併發佇列非同步執行 日誌輸出時間是一定的
2018-12-12 10:13:19.814352+0800 GCD_Dispatch_Barrier_Demo[3297:42890] read
2018-12-12 10:13:19.814375+0800 GCD_Dispatch_Barrier_Demo[3297:42891] read
2018-12-12 10:13:19.814367+0800 GCD_Dispatch_Barrier_Demo[3297:42892] write
    
    
    
  • 使用柵欄方法,將非同步操作暫時變成同步操作

@interface ViewController ()
{
    dispatch_queue_t _queue;
    
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _queue = dispatch_queue_create("read_write_queue", DISPATCH_QUEUE_CONCURRENT);
    
    [self read];
    [self read];
    [self write];
}
- (void)read{
    //
    dispatch_async(_queue, ^{
        sleep(1);
        NSLog(@"read");
    });
}
- (void)write
{
    // 使用柵欄方法
    dispatch_barrier_async(_queue, ^{
        sleep(1);
        NSLog(@"write");
    });

}

// 日誌輸出 則write 輸出時間延遲1秒執行
2018-12-12 10:16:25.164446+0800 GCD_Dispatch_Barrier_Demo[3372:45243] read
2018-12-12 10:16:25.164445+0800 GCD_Dispatch_Barrier_Demo[3372:45244] read
2018-12-12 10:16:26.168443+0800 GCD_Dispatch_Barrier_Demo[3372:45244] write