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模式…