使用 Interface Builder 绑定来观察在非主线程上更改的属性是否安全?
Is it safe to use Interface Builder bindings to observe properties changed on non-main thread?
如果我使用 Interface Builder 进行绑定,例如NSTextField
的值变为 someObject.property
而这个 属性 (假设它是 assign, atomic
类型)将从非主线程更改,这会是 safe/correct 吗?
Cocoa 通常禁止从非主线程更新 UI,所以我想知道绑定机制是否会自动为我安排主线程上的更新,或者直接绑定不安全到可能从其他线程更改的对象。
如果我自己触发 KVO 通知,是否同样适用?
-(void)setProperty: {
dispatch_async(dispatch_get_global_queue(0,0), ^{
[self willChangeValueForKey:@"property"];
…
[self didChangeValueForKey:@"property"];
});
}
NSTextField
是否会观察到 属性 仍会在主线程上自行更新?
(与 相关)
不安全。 KVO 和 Bindings 都不会将事物重定向到主线程。如果您在后台线程上更改观察到的 属性,则会在该后台线程上通知观察者。如果观察者对更改通知的响应是更新 UI,那么你就有问题了。
如果我使用 Interface Builder 进行绑定,例如NSTextField
的值变为 someObject.property
而这个 属性 (假设它是 assign, atomic
类型)将从非主线程更改,这会是 safe/correct 吗?
Cocoa 通常禁止从非主线程更新 UI,所以我想知道绑定机制是否会自动为我安排主线程上的更新,或者直接绑定不安全到可能从其他线程更改的对象。
如果我自己触发 KVO 通知,是否同样适用?
-(void)setProperty: {
dispatch_async(dispatch_get_global_queue(0,0), ^{
[self willChangeValueForKey:@"property"];
…
[self didChangeValueForKey:@"property"];
});
}
NSTextField
是否会观察到 属性 仍会在主线程上自行更新?
(与
不安全。 KVO 和 Bindings 都不会将事物重定向到主线程。如果您在后台线程上更改观察到的 属性,则会在该后台线程上通知观察者。如果观察者对更改通知的响应是更新 UI,那么你就有问题了。