【问题标题】:Is there a good way to check when a variable stop changing its value after continuously changing for a while?有没有一种好方法可以检查变量在连续更改一段时间后何时停止更改其值?
【发布时间】: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


【解决方案1】:

这是类声明

@interface MyClass : NSObject

@property (nonatomic) int keepRate;

@end

下面是实现

@implementation MyClass
- (void)setKeepRate:(int)aKeepRate {
    int oldValue = _keepRate;
    if (oldValue == aKeepRate) {
        // The value is same as before, that means the value is constant now
        // Do whatever you want to do now
    }
    // Update underlaying variable with new value, regardless if it is same or not
    _keepRate = aKeepRate;
}
@end

你也可以对利率做同样的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    相关资源
    最近更新 更多