Swift atomic

2020-12-23  本文已影响0人  吕建雄

Swift中实现类似Objective-C的atomic;

实际上就是在其属性对应的set/get方法中添加锁即可

Swift中实现set/get方法

var _param: Int = 0

var param: Int {

    set{

        _param = newValue

    }

    get{

        return _param

    }

}

如果要添加锁,那么可以使用如下方式:

var _param: Int = 0

var param: Int {

    set{

        objc_sync_enter(_sdkstate)

        _param = newValue

        objc_sync_exit(_sdkstate)

    }

    get{

        var result:Int?

        objc_sync_enter(_param)

        result = _param

        objc_sync_exit(_param)

        return result  ??  0

    }

}

如果每个属性都怎么添加锁的话,代码冗余量会比较大,所以可以抽取一个结构体出来,然后在需要atomic的属性直接使用即可(通过:@propertyWrapper与AtomicValue(default: 0)注解来实现 

@propertyWrapper

struct AtomicValue<Value> {

    private let lock: NSLock

    private var value: Value

    init(default:Value) {

        self.lock = NSLock()

        self.value = `default`

    }

    var wrappedValue: Value {

        get{

            lock.lock()

            defer{ lock.unlock() }

            return value

        }

        set{

            lock.lock()

            value = newValue

            lock.unlock()

        }

    }

}

在类中定义属性的时候,使用如下写法即可:

@AtomicValue(default:0)

private var paramInt:  Int

@AtomicValue(default:"")

private var paramStr:  String

上一篇下一篇

猜你喜欢

热点阅读