代码之家  ›  专栏  ›  技术社区  ›  Mike Nathas

使用Cocoa绑定和线程

  •  0
  • Mike Nathas  · 技术社区  · 5 年前

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

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

    DispatchQueue.main.sync() {
       self.variable = newValue
    }
    

    ? 如果cocoa绑定不是线程安全的,为什么在后台进程写入值时,我从未遇到过由于绑定ui元素的“读取”而导致的任何崩溃?

    将值绑定到ui元素(通过cocoa绑定)并通过异步线程修改它的首选方法是什么?

    谢谢!

    0 回复  |  直到 5 年前
        1
  •  1
  •   ipmcc    5 年前

    是的,如果您修改了cocoa绑定所观察到的对象,那么您应该只在主线程上修改,gcd将修改发送到主线程是一个很好的方法。

    是的,你的应用程序可能大部分时间都运行良好,但这可能是基于运气的,实际上并不正确。问题是cocoa绑定基于键值观察,kvo通知发布在导致变异的线程上。

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