有时候,我们在开发过程中需要对属性的访问进行同步操作,这种属性需要做成原子的,用atomic来修饰属性,即可实现这一点。
如果我们想自己实现,可以按照下面方式写代码:
SFPerson.h
#import <Foundation/Foundation.h> @interface SFPerson : NSObject @property (nonatomic, strong)NSString *name; @end
SFPerson.m
#import "SFPerson.h" @interface SFPerson () { dispatch_queue_t _nameQueue; NSString *_name; } @end @implementation SFPerson - (instancetype)init { if (self = [super init]) { _nameQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); } return self; } - (NSString *)name { __block NSString *localName; dispatch_sync(_nameQueue, ^{ localName = _name; }); return localName; } - (void)setName:(NSString *)name { dispatch_barrier_async(_nameQueue, ^{ _name = name; }); } @end
读取属性的操作可以随机执行,修改属性的操作我们不希望随机执行,所以使用了栅栏块处理。
在队列中,栅栏块必须单独执行,不能与其它块并行。这只对并发队列有意义,因为串行队列中的块总是按顺序逐个来执行的。并发队列如果发现接下来要处理的块是个栅栏块(barrier block),那么就一直要等当前所有并发块都执行完毕,才会单独执行这个栅栏块。待栅栏块执行过后,再按正常方式继续向下处理。