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

时间:2016-01-25 21:42:24

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

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

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

如果我自己发送KVO通知,是否也适用?

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

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

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

1 个答案:

答案 0 :(得分:2)

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