gpt4 book ai didi

ios - 多个 KVO 键 : Why call willChangeValueForKey: twice before didChangeValueForKey:?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:14:47 24 4
gpt4 key购买 nike

我一直在尝试修复我们的 NSOperation 子类中的一个问题,我觉得它可能与我们对 KVO 的手动更改通知有关。在更新 NSOperation 状态时,我检查过的所有来源似乎都执行以下操作:

[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
_isExecuting = NO;
_isFinished = YES;
[self didChangeValueForKey:@"isFinished"];
[self didChangeValueForKey:@"isExecuting"];

相比之下,我们一直是这样做的:

[self willChangeValueForKey:@"isExecuting"];
_isExecuting = NO;
[self didChangeValueForKey:@"isExecuting"];

[self willChangeValueForKey:@"isFinished"];
_isFinished = YES;
[self didChangeValueForKey:@"isFinished"];

谁能告诉我为什么前者似乎是推荐的做法?

Apple 的 KVO 文档似乎也推荐第一种方法。不幸的是,他们没有解释原因。( https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-SW3)/

最佳答案

原因是,从概念上讲,该操作同时改变了两种状态。您希望观察者仅在两个属性的内部状态更新后才收到通知,以便在处理通知时,观察者看到一致的状态。

如果你这样做:

[self willChangeValueForKey:@"isExecuting"];
_isExecuting = NO;
[self didChangeValueForKey:@"isExecuting"];

然后观察者将在 didChange... 调用期间收到 isExecuting 属性的更改通知。如果他们检查处理程序中的操作属性,他们可以看到操作未执行(isExecuting 返回 NO)但也未完成(isFinished 仍然返回 NO)。那没有意义。结果,观察员可能会做一些奇怪的事情。

关于ios - 多个 KVO 键 : Why call willChangeValueForKey: twice before didChangeValueForKey:?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30991784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com