【发布时间】:2019-07-09 11:19:13
【问题描述】:
我正在尝试检查声明为的变量
@property (assign, nonatomic) NSTimeInterval rate; 作为时间计数器不断变化。换句话说,随着时间的流逝,变量的值不断变化,我知道我可以将 KVO 与
- (void)observeValueForKeyPath:...} 函数来观察变量何时改变了它的值,但我还需要知道变量何时停止变化并变为常数。我尝试了一种方法,即在非常短的时间(例如,0.00001 秒)后使用NSTimer 在这里检查变量的值
- (void) checkPlaying:(NSTimer*)t {
NSLog(@"%f %f", self.keepRate, (double)self.rate);
return self.keepRate != (double)self.rate;
}
- (void) isPlaying{
self.keepRate = (double)self.rate;
[NSTimer scheduledTimerWithTimeInterval:0.00001
target:self
selector:@selector(checkPlaying:)
userInfo:nil
repeats:NO];
}
并将其与之前存储的值进行比较,但这也不起作用; self.keepRate 和 (double)self.rate; 的值在该 NSLog 中仍然相同。我以为它会在 0.00001 秒后调用checkPlaying,但我可能会误解一些东西。有人可以帮忙吗?或者,如果有人想出一个想法来检查变量何时停止变化,那也可能会很好。谢谢
编辑:实际上,当用户按下按钮时,变量开始更改其值,并且在用户按下相同按钮后它会停止更改值。这就是为什么我想也许我可能需要 0.0001 秒来检查变量的值是否发生了变化。我知道我可以只使用按钮来检查值是否发生变化,但是如果我这样做,还有很多问题和事情需要处理,这就是我问这个问题的原因。
【问题讨论】:
-
如何记住最后的 5,100..x 值(observeValue,记住 sum/avg 等),如果它们不改变,声明它是稳定的? 0.00001 间隔也是残酷的。 0.05 就足够了
-
在 KVO 通知中,您可以检查它是否是新值,KVO 已经提供了这种机制。只需保留一个布尔变量即可设置和重置。如果新值设置 bool isChanging = true else false.
-
@vivekDas 非常感谢您的回复,问题是当它停止更改时,密钥没有被任何新值分配,不是吗?换句话说,它可能不会调用
observeValueForKeyPath。或者,如果我误解了某些内容,您能否详细解释一下该机制? -
@MarekH 是的,这就是我想要做的,但我在记忆过程时遇到了问题,因为我尝试存储的值都是相同的,即使它应该在一段时间后改变你可以看到
self.keepRate和(double)self.rate是一样的。无论如何,感谢您对 0.05 事物的建议。 -
您需要多长时间才能考虑“不再变化”的值?一秒?半秒? 1/10 秒?你真的想说“它在
0.00001秒内没有改变,所以现在我知道它是恒定的”(这是 1/100,000 秒,如果我没记错的话)?
标签: ios objective-c asynchronous time nstimer