如何在这个简单的while循环中使用NSTimer?

时间:2012-07-30 19:50:44

标签: iphone objective-c ios nstimer

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

我浏览了有关NSTimer类的文档,但我无法理解我在这种情况下如何使用此对象:

e.g。

-(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...
    ....
    ...
}

任何帮助?

2 个答案:

答案 0 :(得分:3)

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

最重要的是,在一个繁忙的循环中停留将近一秒半将耗尽你的电池。如果您只需要等待1.4s,那么最好打电话给sleepForTimeInterval:,如下所示:

[NSThread sleepForTimeInterval:1.4];

您还可以使用<time.h>中的clock()来衡量短时间间隔,例如:

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;
    }

}

答案 1 :(得分: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;
}

查看documentation