Cocoa 如何将NSProgressIndicator绑定到NSOperation的属性?

Cocoa 如何将NSProgressIndicator绑定到NSOperation的属性?,cocoa,concurrency,key-value-observing,nsoperation,Cocoa,Concurrency,Key Value Observing,Nsoperation,我有一个反映NSOperation状态的窗口。如何将NSProgressIndicator绑定到NSOperation的进度属性?AppKit不是线程安全的。对UI对象的任何更新都必须在主线程上进行。KVO不会跨线程分派观察消息。因此,除了普通KVO之外,您还需要另一种更新进度指示器的方法 在NSOperation的main方法中,需要定期发送进度消息。最简单的方法是使用带有自定义通知的NSNotificationCenter,以便主线程可以侦听更新。(请注意,通知始终在发送它们的线程上传递,因

我有一个反映
NSOperation
状态的窗口。如何将
NSProgressIndicator
绑定到
NSOperation
的进度属性?

AppKit不是线程安全的。对UI对象的任何更新都必须在主线程上进行。KVO不会跨线程分派观察消息。因此,除了普通KVO之外,您还需要另一种更新进度指示器的方法

NSOperation
main
方法中,需要定期发送进度消息。最简单的方法是使用带有自定义通知的
NSNotificationCenter
,以便主线程可以侦听更新。(请注意,通知始终在发送它们的线程上传递,因此您需要使用
performselectornmainthread:
方法确保通知在UI线程上传递。)

在主线程中,需要将类添加为观察者,以接收这些通知并更新进度指示器。如果要对进度指示器使用绑定,可以将其绑定到控制器对象上的属性,当您从
NSOperation

收到进度通知时,可以更新该属性。Ben Copsey的包装器正是这样做的

该请求是
NSOperation
的子类,在实例化时可以向其传递一个进度指示器


如果您想了解代码的工作原理,可以查看该代码。

一般来说,这是正确的,但NSProgressingIndicator的更新被专门记录为线程安全。@Barry Wark:您有链接吗,我在文档中没有找到任何内容。我是否也可以使用
perfomselectornmainthread:
来响应KVO消息?我也没有看到任何关于NSProgressIndicator是线程安全的内容。。。那么您的
NSOperation
会触发KVO通知吗?假设您的操作是线程安全的,您应该能够调用performSelectorOnMainThread:来响应KVO消息。但是,我建议KVO处理程序只调用performSelectorOnMainThread:,否则最终会导致各种与线程相关的问题。只要小心,你应该会没事的。就我看来,这违反了MVC模式…