如果我使用 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
是否仍会在主线程上更新自身?
最佳答案
这不安全。 KVO 和 Bindings 都不会将事物重定向到主线程。如果您更改后台线程上的观察者属性,则会在该后台线程上通知观察者。如果观察者对更改通知的响应是更新 UI,那么您就会遇到问题。
关于multithreading - 使用 Interface Builder 绑定(bind)来观察非主线程上更改的属性是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35002943/