Multithreading 使用cocoa绑定和线程

Multithreading 使用cocoa绑定和线程,multithreading,cocoa,grand-central-dispatch,cocoa-bindings,Multithreading,Cocoa,Grand Central Dispatch,Cocoa Bindings,我有一些标签绑定到一些变量,这些变量通过GCD在其他线程中修改。 现在我已经读到cocoa绑定不是线程安全的,但是我的应用程序运行良好。当变量的值在后台线程中更新时,UI会更新 这是在后台线程中进行计算的正确方法吗?如果我需要更改变量值,请通过 DispatchQueue.main.sync() { self.variable = newValue } ?? 如果cocoa绑定不是线程安全的,为什么我从来没有遇到任何崩溃,因为在后台进程写入值时读取绑定的UI元素 通过cocoa绑定将值绑

我有一些标签绑定到一些变量,这些变量通过GCD在其他线程中修改。 现在我已经读到cocoa绑定不是线程安全的,但是我的应用程序运行良好。当变量的值在后台线程中更新时,UI会更新

这是在后台线程中进行计算的正确方法吗?如果我需要更改变量值,请通过

DispatchQueue.main.sync() {
   self.variable = newValue
}
?? 如果cocoa绑定不是线程安全的,为什么我从来没有遇到任何崩溃,因为在后台进程写入值时读取绑定的UI元素

通过cocoa绑定将值绑定到UI元素并通过异步线程修改它的首选方式是什么


谢谢

是的,如果修改Cocoa绑定观察到的对象,则只应在主线程上进行修改,GCD将修改发送到主线程是一种很好的方法

是的,你的应用程序可能在大多数情况下都运行良好,但这可能是运气使然,实际上并不正确。问题在于Cocoa绑定基于键值观察,KVO通知发布在导致变异的线程上


这也是一个复杂的问题。只要你的应用程序相对简单和快速,两个线程发生冲突的可能性就会小得多。想象一下,当你的应用程序变得更加复杂和计算密集。。。出现了一个问题。。。但是到目前为止,您可能有数百个地方正在修改来自多个线程的绑定属性。从长远来看,只要遵守规则,你就不会悲伤。使用主线程更新绑定到对象的属性,并尝试将绑定属性保持为不可变的值语义类型。

尝试将绑定属性保持为不可变的值语义类型为什么?我将一些标签绑定到一个可变的字典值,必须将其设置为@objc dynamic,并经常通过线程更新此字典值,多年来我从未在这里发生过任何崩溃。@MikeNathas-这一评论与我多年来一直以这种方式清理我的枪,但还没有开枪自杀是一样的!一个人能做某事的事实并不意味着做某事是明智的。你可能会在没有问题的情况下做一千次,然后在你第一次做一些琐碎的不同或更糟的事情时,你的一个队友做了,然后发现你自己花了半个月的时间调试,试图找出哪里出了问题。只是说,“…严格来说,将绑定限制为不可变的值语义类型并不是必需的,有些东西必须是可变的,才能使值不断变化,但使用不可变的值语义类型可以消除一种可能的路径,从而避免出现特别隐蔽且难以调试的错误。这是一个最佳实践,而不仅仅是一个“规则”本身。也不确定如何将其视为绑定到一个不可变的值是没有意义的,我可以简单地添加一个固定的标签。我想说的是,可变字典中的值应该是不可变的。i、 e.使用NSString而不是NSMutableString。如果其他内容更改了可变字符串,那么绑定几乎肯定不会更新。我猜您会立即更新线程,但主线程中的值的更新会由框架安排。即使是一个线程,绑定也不一定是同步的。您可以在更新变量的行之前设置断点,然后当程序停在那里时,在GCD调度函数上设置符号断点。您可能会看到绑定代码调用dispatch\u async。看见抱歉,ObjC和非Swift。@stevesliva KVO和绑定是同步的。控件的可视更新不可用。