Swift: потокобезопасный доступ к словарю через привязки какао - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть класс, и мне нужно привязать несколько полей 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]
        }
    }

}
...