02-dispatch_barrier
1 dispatch_barrier_async 概念
柵欄方法,暫時的將一部操作做成一個同步操作,向一個柵欄一樣的分開
dispatch_barrier_async函式的作用是在程式管理中起到一個柵欄的作用,它等待所有位於barrier函式之前的操作執行完畢後執行,並且在barrier函式執行之後,barrier函式之後的操作才會得到執行,該函式需要同dispatch_queue_create函式生成的concurrent Dispatch Queue佇列一起使用
2 作用
1.實現高效率的資料庫訪問和檔案訪問
2.避免資料競爭
3 注意點:
- 佇列一定不能是全域性佇列(dispatch_get_global_queue)
- 使用自己建立的併發佇列(dispatch_queue_create(“read_write_queue”, DISPATCH_QUEUE_CONCURRENT);)
- 函式必須為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