Use cocoa bindings and threads
我有一些标签绑定到一些变量,这些变量通过 GCD 在其他线程中修改。
现在我读到可可绑定不是线程安全的,但我的应用程序运行良好(当变量的值在后台线程中更新时 UI 会更新)
这是否是在后台线程中进行计算的正确方法,如果我需要更改变量值,请通过
1 2 3 | DispatchQueue.main.sync() { self.variable = newValue } |
?
如果 cocoa 绑定不是线程安全的,为什么我从来没有遇到过任何崩溃,因为当值是由后台进程写入时绑定的 UI 元素的"读取"?
将值绑定到 UI 元素(通过可可绑定)并通过异步线程修改它的首选方法是什么?
谢谢!
是的,如果你修改了一个被 Cocoa 绑定观察到的对象,你应该只在主线程上这样做,而 GCD 将修改分派到主线程是一个很好的方法。
是的,您的应用可能在大多数情况下都能正常运行,但这可能是靠运气而不是实际正确的。问题是 Cocoa 绑定是基于 Key Value Observation 的,并且 KVO 通知发布在导致突变的线程上。
这也是一个复杂性问题。只要您的应用程序相对简单且快速,两个线程相互冲突的可能性就会小得多。想象一下,当您的应用程序变得更加复杂且计算量更大时......并且出现了一个问题......但此时您可能有数百个地方正在修改来自多个线程的绑定属性。从长远来看,只要遵守规则,就会让你免于悲痛。使用主线程更新绑定到对象并尝试将绑定属性保持为不可变的值语义类型。