【问题标题】:How do I bind a NSProgressIndicator to a property of a NSOperation?如何将 NSProgressIndicator 绑定到 NSOperation 的属性?
【发布时间】:2009-09-08 16:58:59
【问题描述】:

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

【问题讨论】:

    标签: cocoa concurrency key-value-observing nsoperation


    【解决方案1】:

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

    在您的NSOperationmain 方法中,您需要定期发送进度消息。最简单的做法是将NSNotificationCenter 与自定义通知一起使用,以便主线程可以侦听更新。 (请注意,通知总是在发送它们的线程上传递,因此您需要使用performSelectorOnMainThread: 方法来确保通知在 UI 线程上传递。)

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

    【讨论】:

    • 一般来说,这是正确的,但是对 NSProgressIndicator 的更新被特别记录为线程安全的。
    • @Barry Wark:你有链接吗,我在文档中没有找到任何东西。
    • 我也可以使用perfomSelectorOnMainThread: 来响应 KVO 消息吗?
    • 我也没有看到任何关于 NSProgressIndicator 是线程安全的......所以你的 NSOperation 会做一些触发 KVO 通知的事情吗?假设您的操作是线程安全的,您应该能够调用 performSelectorOnMainThread: 来响应 KVO 消息。但是,我建议 KVO 处理程序除了调用 performSelectorOnMainThread: 之外什么都不做,否则你最终会得到各种与线程相关的麻烦。小心点,你应该没事的。
    【解决方案2】:

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

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

    如果您想了解它是如何工作的,您可以查看该代码。

    【讨论】:

    • 据我所知,这违反了 MVC 模式……
    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 2018-08-08
    • 2023-01-12
    • 2011-04-17
    • 2022-01-01
    • 2016-06-23
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多