У меня есть класс, и мне нужно привязать несколько полей NSTextFields к некоторым значениям словаря, который будет изменен потоком.
class Test: NSObject {
@objc dynamic var dict : [String:Int] = [:]
let queue = DispatchQueue(label: "myQueue", attributes: .concurrent)
func changeValue() {
queue.async(flags: .barrier) {
self.dict["Key1"] = Int.random(in: 1..<100)
}
}
func readValue() -> Int? {
queue.sync {
return self.dict["Key1"]
}
}
}
Насколько я понял, это способ сделать ( поэтому не доступ к переменной напрямую, а через забавный c, который обрабатывает очередь.
Но что, когда я пытаюсь связать NSTextField с "Key1" из dict, используя привязки какао? Привязка к переменной "dict "напрямую работает в моих тестах, но я не уверен (я вполне уверен, что это не так), если это потокобезопасно. Каков будет правильный способ сделать это?
Редактировать: Этот пример кода выглядит le git, но почему-то не получается
class Test: NSObject {
var _dict : [String:Int] = ["Key1":1]
let queue = DispatchQueue(label: "myQueue", attributes: .concurrent)
@objc dynamic var dict:[String:Int] {
get {
queue.sync { return self._dict }
}
set {
queue.async(flags: .barrier) { self._dict = newValue }
}
}
func changeValue() {
queue.async(flags: .barrier) {
// This change will not be visible in the bound object
self._dict["Key1"] = Int.random(in: 1..<100)
// This causes a crash
self.dict = ["Key1":2]
}
}
}