【问题标题】:NSoperation and key value observingNS操作和键值观察
【发布时间】:2010-04-09 14:44:28
【问题描述】:

我正在创建一个 MyOperation 对象(继承自 NSOperation)并添加到 NSOperationQueue。然后我在 MyOperation 上做 KVO。 我正在使用这种方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

如果完成,则从 MyOperation 获取一个值。在此方法中,我使用其他类的便捷方法来获取其他数据。

可能是observeValue...方法中的同步问题?

【问题讨论】:

    标签: objective-c iphone nsoperation nsoperationqueue


    【解决方案1】:

    我没有足够的声誉来评论或否决,但我会否决 dannywartnaby 的回答。 NSOperation 在其操作中本质上使用 KVO;必须实现 isFinished 和 isExecuted 作为处理的一部分,例如是 100% KVO 并且是操作所需的与客户端/队列的合同的一部分。因此,建议避免这些是不准确的; NSOperation 本身使用的是 KVO,所以采用 dannywartnaby 的前提表明 NSOperation 的实现本身就有缺陷,这绝对不是这样的。

    诚然,开发人员必须注意正确使用 KVO,尽管我认为继承 NSOperation 是一项不平凡的任务,可能留给更有经验的 Objective-C 程序员。有人可能会争辩说,通知对于操作所承担的工作来说过于粗略,尽管并非总是如此,但我认为我们在就实践提供建议时必须小心,以确保错误消息不会作为最佳实践传递。 Danny,您是否愿意详细说明为什么在使用 NSOperation 或线程时不建议使用 KVO?很多 NSOperation 实现的例子都使用了 KVO...

    【讨论】:

    • NSPertation 在其 impl 中使用 KVO 是一个有争议的问题;我并不是说 KVO 不好,我是说通知是更好的选择。其他使用 KVO 的类不会突然使所有使用 KVO 的方法都有效。使用 KVO 将您专门绑定到操作、了解键路径、成为观察者,而观察者又将您的两个类耦合在一起。另一方面,通知很简单;将其发布到您的操作中,为其提供数据以及应用程序中的其他内容...
    • 我建议您再次阅读我的评论,我从未说过或暗示它“使 KVO 的所有用途都有效”我只是指出您说使用 KVO “不明智”是非常误导。想一想您将使用 KVO 而不是通知的任何场合;通知是粗粒度和广播的,KVO 意味着两个对象之间的耦合。想想操作的概念,它是一个原子的工作,有东西创建它,并且可能需要监控它在做什么以及何时完成。如果应用需要知道发生了什么通知,如果客户端只知道,KVO
    【解决方案2】:

    我不知道您的用例,但将 KVO 用于线程/操作并不明智。

    您可以改为让您的 Operation 对象在完成后发布通知。或者定义一个委托协议并为您的操作提供一个委托...然后您可以定义某种“myOperationComplete:”方法,该方法由您的操作调用,使用 performSelectorOnMainThread 对给定的委托。

    【讨论】:

    • KVO 一切正常。我只想要这些问题,如果有的话。你说有一些问题。你能指出哪些是那些?
    • 可能在调用“main”之前取消操作。因此,在某些情况下,发布通知需要做一些额外的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多