我正在创建一个MyOperation对象(继承自NSOperation)并添加到NSOperationQueue。然后我在MyOperation上做KVO。 我正在使用这种方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
从MyOperation获取值,如果它已完成。在这个方法中,我使用其他类的方便方法来获取其他数据。
也许这里有observeValue ...方法中的同步问题?
答案 0 :(得分:12)
我没有足够的声誉评论或投票,但我会低估dannywartnaby的答案。 NSOperation在其操作中本质上使用KVO;必须实现isFinished和isExecuted作为处理的一部分,例如100%KVO并且是操作与客户端/队列的所需合同的一部分。所以建议应该避免这些是不准确的; NSOperation使用KVO本身,因此采用dannywartnaby的前提将表明NSOperation的实施本身存在缺陷,但绝对不是这样。
不可否认,开发人员必须注意正确使用KVO,尽管我认为继承NSOperation是一项非常重要的任务,可能留给更有经验的Objective-C程序员。有人可能会说,通知对于某项行动所开展的工作来说过于粗糙,虽然并非总是如此,但我认为在提出建议时必须小心谨慎,以确保错误信息不是最佳做法。 Danny,您是否愿意详细说明为什么在使用NSOperation或线程时不建议使用KVO?许多NSOperation实施的例子都使用KVO ......
答案 1 :(得分:-3)
我不知道你的用例,但使用KVO进行线程/操作并不明智。
您可以在操作对象完成后发布通知。或者,也可以定义一个委托协议,并为你的Operation赋予一个委托......然后你可以使用performSelectorOnMainThread定义某种'myOperationComplete:'方法,该方法由你的Operation对它给出的委托调用。