如何在主线程之外访问小部件状态

时间:2018-05-03 12:28:31

标签: swift multithreading cocoa

我需要从不是主线程的线程中读取复选框的状态。看来我不能简单地使用以下内容(这会导致主线程检查器在后台线程上调用“UI API调用: - [NSCell state]”):

myCheckbox.state

我应该做什么呢?

1 个答案:

答案 0 :(得分:1)

我目前的解决方案是维护一个在切换复选框时更新的属性,并访问该属性而不是直接读取复选框的状态。

欢迎更优雅的东西:这很麻烦;如果你想让属性为只读或正确处理从程序内部设置它的值,那就更是如此。

class myViewController: NSViewController {

    @IBOutlet private weak var myCheckbox: NSButtonCell!
    public var myCheckboxState: Bool! // This can be read from any thread.

    @IBAction func onMyCheckboxAction(_ sender: NSButtonCell) {
        myCheckboxState = (myCheckbox.state == NSOnState)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        myCheckboxState = (myCheckbox.state == NSOnState)
        ...
    }

    ...
}