façon la plus simple utilise une file d'attente série
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
}
}
}
}
exemple plus utiliser la lecture simultanée et la barrière de synchronisation pour l'écriture
Dans le cas d'une propriété de classe, vous pouvez utiliser une file d'attente privée simultanée et lire des threads différents simultanément et répartir l'écriture de manière asynchrone avec une barrière
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
}
}
}
}
Donc, pour appliquer la synchronisation Je dois créer une autre propriété calculée? – Boon
@Boon vous devez "isoler" votre stockage "privé", donc l'utilisation de la propriété calculée semble être une étape logique, n'est-ce pas? – user3441734
@Boon Je ne sais pas, quel est exactement votre scénario d'utilisation, mais je recommande fortement de vérifier cette bonne lecture https://www.mikeash.com/pyblog/friday-qa-2015-02-06-locks-thread -safety-and-swift.html – user3441734