【发布时间】:2019-08-12 10:20:15
【问题描述】:
我有一些标签绑定到一些变量,这些变量通过 GCD 在其他线程中修改。
现在我读到可可绑定不是线程安全的,但我的应用程序运行良好(当变量的值在后台线程中更新时,UI 会更新)
这是在后台线程中进行计算的正确方法吗?如果我需要更改变量值,请通过
DispatchQueue.main.sync() {
self.variable = newValue
}
? 如果 cocoa 绑定不是线程安全的,为什么我从来没有遇到任何崩溃,因为在后台进程写入值时“读取”绑定的 UI 元素?
将值绑定到 UI 元素(通过可可绑定)并通过异步线程修改它的首选方法是什么?
谢谢!
【问题讨论】:
-
我的猜测是您立即更新线程,但主线程中值的更新由框架安排。即使都是一个线程,绑定也不一定是同步的。您可以在更新变量的行之前设置一个断点,然后当程序停在那里时,在 GCD 调度函数上设置符号断点。您可能会看到绑定代码为您调用
dispatch_async。见this question。抱歉,ObjC 而不是 Swift。 -
@stevesliva KVO 和绑定是同步的。控件的视觉更新不是。
标签: multithreading cocoa grand-central-dispatch cocoa-bindings