浮动比较和显示消息

时间:2011-11-28 23:47:02

标签: iphone objective-c ios floating-point

我有一个计时器来计算我的音频时间。 当你有时间我会在屏幕上放一个标签文字:

- (void)updateTime:(NSTimer *)timer
{

    currentLocation = audio.currentTime;
    [lblCurrentLocation setText:[NSString stringWithFormat:@"%.4f Sec",currentLocation]];

    if (currentLocation == 4.7404)
    {
        [lblMsg setText:@"Sound p 1"];
    }

}

此IF是比较CurrentLocation与4.7404不起作用。有没有人有任何想法?

谢谢

2 个答案:

答案 0 :(得分:1)

在4.7404秒之后,您无法可靠地让计时器调用updateTime:方法。 iPhone不保证计时器的任何特定级别的准确性。

此外,iOS将“Sound p 1”字符串转换为位图并将其放入帧缓冲区需要时间。因此,即使您在4.7404秒完成调用,也会在更新帧缓冲区之前进行调用。

此外,iPhone的LCD显示屏的响应时间非零。因此,在iOS更新帧缓冲后,屏幕上的像素需要一段时间才能更改。

此外,人类无法以.0001秒的准确度检测到变化。因此,即使像素在4.7404秒完全改变,用户也无法确定它是在4.739秒或4.741秒发生的。

所以你要求的是愚蠢的。

您应该在至少4.7404秒后尽快显示您的信息:

- (void)updateTime:(NSTimer *)timer
{
    // Give your object a BOOL didSeeImportantTime property.
    if (!self.didSeeImportantTime) {
        currentLocation = audio.currentTime;
        if (currentLocation < 4.7404) {
            [lblCurrentLocation setText:[NSString stringWithFormat:@"%.4f Sec",currentLocation]];
        } else {
            self.didSeeImportantTime = YES;
            [lblMsg setText:@"Sound p 1"];
        }
    }
}

答案 1 :(得分:0)

您应该以不同方式比较浮点数。这是a post on how to do it in C++。您可以在Objective C中使用它。

此外,使用计时器试图从音频文件中获取这样一个精确的位置并不是很准确。