multithreading - 使用 Interface Builder 绑定(bind)来观察非主线程上更改的属性是否安全?

标签 multithreading cocoa key-value-observing cocoa-bindings

如果我使用 Interface Builder 进行绑定(bind),例如NSTextField 的值为 someObject.property 并且此属性(假设它是 assign,atomic 类型)将从非主线程更改,将这安全/正确吗?

Cocoa 通常禁止从非主线程更新 UI,所以我想知道绑定(bind)机制是否自动为我安排在主线程上发生更新,或者直接绑定(bind)到可能从其他线程更改的对象是否不安全。

如果我自己触发 KVO 通知,同样的情况也适用吗?

-(void)setProperty: {
    dispatch_async(dispatch_get_global_queue(0,0), ^{
        [self willChangeValueForKey:@"property"];
        …
        [self didChangeValueForKey:@"property"];
    });
}

观察该属性的 NSTextField 是否仍会在主线程上更新自身?

<小时/>

(与 problems I'm seeing with waitUntilExit 相关)

最佳答案

这不安全。 KVO 和 Bindings 都不会将事物重定向到主线程。如果您更改后台线程上的观察者属性,则会在该后台线程上通知观察者。如果观察者对更改通知的响应是更新 UI,那么您就会遇到问题。

关于multithreading - 使用 Interface Builder 绑定(bind)来观察非主线程上更改的属性是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35002943/

相关文章:

Objective-C KVO 不适用于 C 联合体

cocoa - 这是一种符合 KVO 的良好方式来建模可变的多对多关系吗?

multithreading - 使用 angularJS 应用程序提高 Symfony2 的性能

cocoa - 使用钥匙串(keychain)本质上是不安全的(取回元素时?)

c++ - c++11的线程,用new创建

swift - 苹果系统。用管理员权限替换共享文件夹中的应用程序

ios - 应用程序图标角标(Badge)会短暂清除,但在 GameKit 回合制应用程序中,角标(Badge)编号会在几秒钟内返回

objective-c - 具有运行到完成语义的 KVO - 这可能吗?

spring - 使用 RedisQueueInboundGateway 进行多线程处理

Android如何在其他类中运行OnUiThread?