如何同步使用 didSet 的属性的访问(使用 GCD 或 objc_sync_enter)?
我有一处房产,有一个房产观察员。如何使用私有队列来同步属性的获取/设置
var state: State = .disconnected {
// Q: How to sync get/set access here?
didSet {
// do something
}
}
最简单的方法是使用串行队列
import Dispatch
struct S {
private var i: Int = 0 {
didSet {
print("someone did set new value:", i)
}
}
private let queue = DispatchQueue(label: "private", qos: .userInteractive) // high priority
var value: Int {
get {
return queue.sync {
return i
}
}
set {
if newValue == value {
return
}
queue.sync {
i = newValue
}
}
}
}
更高级的示例使用并发读取和同步屏障进行写入
import Dispatch
struct S {
private var i: Int = 0 {
didSet {
print("someone did set new value:", i)
}
}
private let queue = DispatchQueue(label: "private", qos: .userInteractive, attributes: .concurrent) // high priority
var value: Int {
get {
return queue.sync {
return i
}
}
set {
if newValue == value {
return
}
queue.sync(flags: .barrier) {
i = newValue
}
}
}
}
对于类属性,您可以使用并发私有队列并同时从不同线程读取并使用屏障异步分派写入
import Dispatch
class S {
private var i: Int = 0 {
didSet {
print("someone did set new value:", i)
}
}
private let queue = DispatchQueue(label: "private", qos: .userInteractive, attributes: .concurrent) // high priority
var value: Int {
get {
return queue.sync {
return i
}
}
set {
if newValue == value {
return
}
queue.async(flags: .barrier) { [unowned self] in
self.i = newValue
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)