iOS开发专区

iOS深入理解GCD 第四篇(dispatch_barrier_

2017-09-08  本文已影响43人  镜花水月cy

本文摘自http://www.cnblogs.com/ziyi--caolu/p/4900650.html

在访问数据库或者文件的时候,我们可以使用dispatch_barrier_async避免数据竞争问题,代码如下:

#import <Foundation/Foundation.h>
 
@interface ZYPerson : NSObject
@property (nonatomic, copy) NSString *name;
@end
 
 
#import "ZYPerson.h"
 
@interface ZYPerson ()
@end
 
static NSString *_name;
static dispatch_queue_t _concurrentQueue;
@implementation ZYPerson
- (instancetype)init
{
    if (self = [super init]) {
       _concurrentQueue = dispatch_queue_create("com.person.syncQueue", DISPATCH_QUEUE_CONCURRENT);
    }
    return self;
}
- (void)setName:(NSString *)name
{
    dispatch_barrier_async(_concurrentQueue, ^{
        _name = [name copy];
    });
}
- (NSString *)name
{
    __block NSString *tempName;
    dispatch_sync(_concurrentQueue, ^{
        tempName = _name;
    });
    return tempName;
}
@end

需求:多个getter方法(也就是读取)是可以并发执行的,而getter(读)与setter(写)方法是不能并发执行的。

在队列中,barrier块必须单独执行,不能与其他block并行。这只对并发队列有意义,并发队列如果发现接下来要执行的block是个barrier block,那么就一直要等到当前所有并发的block都执行完毕,才会单独执行这个barrier block代码块,等到这个barrier block执行完毕,再继续正常处理其他并发block。

因此在上面的代码中,setter方法中使用了barrier block以后,对象的读取操作依然是可以并发执行的,但是写入操作就必须单独执行了

附上一个链接 http://www.jianshu.com/p/9ed95082f256 dispatch_barrier_sync和dispatch_barrier_async的对比

上一篇 下一篇

猜你喜欢

热点阅读