OC实现同步访问属性

时间:2025-02-12 14:33:51

有时候,我们在开发过程中需要对属性的访问进行同步操作,这种属性需要做成原子的,用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),那么就一直要等当前所有并发块都执行完毕,才会单独执行这个栅栏块。待栅栏块执行过后,再按正常方式继续向下处理。