2

我有一个 -(void) 方法正在执行,并且在某一时刻它进入一个 while 循环,该循环在它要求它们的那一刻直接从加速度计获取值

我浏览了有关 NSTimer 类的文档,但我无法理解在我的案例中我应该如何使用这个对象:

例如

-(void) play
{
    ......
    ...



    if(accelerationOnYaxis >0 && accelerationOnYaxis < 0.9 )
    {
        startTimer;
    }

    while(accelerationOnYaxis >0 && accelerationOnYaxis < 0.9)
    {
        if(checkTimer >= 300msec)
        {

           printOut_AccelerationStayedBetweenThoseTwoValuesForAtLeast300msecs;
           break_Out_Of_This_Loop;
        }

    }

    stopTimerAndReSetTimerToZero;

    .....
    more code...
    ....
    ...
}

有什么帮助吗?

4

2 回答 2

3

您不能使用 来执行此操作NSTimer,因为它需要您的代码退出才能触发。NSTimer使用事件循环来决定何时给您回电;如果您的程序在其循环中保留控件while,则计时器无法触发,因为永远不会到达检查是否该触发的代码。

最重要的是,在忙碌的循环中停留近一秒半会耗尽你的电池。如果您只是需要等待1.4s,最好调用sleepForTimeInterval:,如下所示:

[NSThread sleepForTimeInterval:1.4];

您还可以使用clock()from<time.h>来测量较短的时间间隔,如下所示:

clock_t start = clock();
clock_t end = start + (3*CLOCKS_PER_SEC)/10; // 300 ms == 3/10 s
while(accelerationOnYaxis >0 && accelerationOnYaxis < 0.9)
{
    if(clock() >= end)
    {
       printOut_AccelerationStayedBetweenThoseTwoValuesForAtLeast300msecs;
       break_Out_Of_This_Loop;
    }

}
于 2012-07-30T20:04:01.860 回答
1

NSTimer工作方式与您想要的有所不同。您需要的是计时器的计数器,以获取它循环的次数。如果您的计数器变为 14(如果它是整数),您可以使其无效。

//start timer
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1
        target:self
        selector:@selector(play:)
        userInfo:nil
        repeats:YES];

//stop timer
[timer invalidate];

你可以在没有那个时间的情况下创建你的函数。

- (void)play {
    ......
    ...


    counter++; //declare it in your header

    if(counter < 14){
        x++; //your integer needs to be declared in your header to keep it's value
    } else {
        [timer invalidate];
    }

    useValueofX;
}

看看文档

于 2012-07-30T20:03:35.503 回答