【发布时间】:2009-09-08 16:58:59
【问题描述】:
我有一个反映NSOperation 状态的窗口。我应该如何将NSProgressIndicator 绑定到NSOperation 的进度属性?
【问题讨论】:
标签: cocoa concurrency key-value-observing nsoperation
我有一个反映NSOperation 状态的窗口。我应该如何将NSProgressIndicator 绑定到NSOperation 的进度属性?
【问题讨论】:
标签: cocoa concurrency key-value-observing nsoperation
AppKit 不是线程安全的。 UI 对象的任何更新必须发生在主线程上。 KVO 不会跨线程发送观察消息。因此,除了普通的 KVO,您还需要另一种更新进度指示器的方法。
在您的NSOperation 的main 方法中,您需要定期发送进度消息。最简单的做法是将NSNotificationCenter 与自定义通知一起使用,以便主线程可以侦听更新。 (请注意,通知总是在发送它们的线程上传递,因此您需要使用performSelectorOnMainThread: 方法来确保通知在 UI 线程上传递。)
在您的主线程中,您需要将您的类添加为观察者以接收这些通知并更新进度指示器。如果您想为进度指示器使用绑定,可以将其绑定到控制器对象上的一个属性,当您收到来自NSOperation 的进度通知时更新该属性。
【讨论】:
perfomSelectorOnMainThread: 来响应 KVO 消息吗?
NSOperation 会做一些触发 KVO 通知的事情吗?假设您的操作是线程安全的,您应该能够调用 performSelectorOnMainThread: 来响应 KVO 消息。但是,我建议 KVO 处理程序除了调用 performSelectorOnMainThread: 之外什么都不做,否则你最终会得到各种与线程相关的麻烦。小心点,你应该没事的。
【讨论】: