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

时间:2009-09-08 16:59:00

标签: cocoa concurrency key-value-observing nsoperation

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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:0)

Ben Copsey的ASIHTTPRequest包装器就是这样做的。

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

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