dispatch_barrier_async 函数可以方便的实现多读单写的需求,多线程同时读,但是只能一个线程写操作,并且在写操作完成之后才能继续读.
直接上代码:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *dataArray;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.dataArray = [NSMutableArray array];
[self.dataArray addObjectsFromArray:@[@"1",@"2"]];
[self testBarrierAsync];
}
- (void)testBarrierAsync
{
//创建一个并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.gcd.barrier.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
//并行操作
void (^blk1)(void) = ^{
NSLog(@"当前的数据====%@",self.dataArray);
};
void (^blk2)(void) = ^{
NSLog(@"当前的数据====%@",self.dataArray);
};
void (^blk3)(void) = ^{
NSLog(@"当前的数据====%@",self.dataArray);
};
//栅栏函数执行操作
void (^barrierBlk)(void) = ^{
[self.dataArray addObject:@"9"];
[self.dataArray addObject:@"8"];
};
//执行所有操作
dispatch_async(concurrentQueue, blk1);
dispatch_async(concurrentQueue, blk3);
dispatch_barrier_async(concurrentQueue, barrierBlk);
dispatch_async(concurrentQueue, blk2);
}
@end
从代码里可以看到 前面读取的两次数据是未写入的数据,数组里只是 1,2 两个,当经过写操作的时候,新增了两个数据,后面再次打印这个数组就是最新的数据了
注意点
dispatch_barrier_async
栅栏函数中传入的参数队列必须是由 dispatch_queue_create 方法创建的队列,否则,与dispatch_async无异,起不到“栅栏”的作用了,对于dispatch_barrier_sync也是同理。
其次,读和写要在同一个队列中