2016-01-25 19 views
0

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

可可一般禁止从非主线程更新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

+0

不,不是。重新思考你的建筑(并阅读Brent Simmons撰写的这篇优秀的博客文章系列:http://inessential.com/2015/05/22/how_not_to_crash_4_threading) – cacau

回答

2

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

+0

哦,无赖!我必须重新构建我的应用程序:( – Kornel