1

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

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

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

也许在 observeValue... 方法中存在同步问题?

4

2 回答 2

12

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

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

于 2011-03-24T14:43:15.140 回答
-3

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

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

于 2010-04-09T15:34:03.833 回答