我正在使用 NSTimer ,并且在某些情况下,我想将 NSTimer 调用方法的调用时间加倍。

基本上:如果我将它设置为每 0.5 秒调用一次,我想偶尔延迟它,以便在下一次调用它之前等待 1.0 秒(时间的两倍)。

但是,我在实现这一点时遇到了很大的困难。这是我最初的尝试:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [NSTimer scheduledTimerWithTimeInterval:0.5
                                     target:self
                                   selector:@selector(timerMethod:)
                                   userInfo:nil
                                    repeats:YES];
}

- (void)timerMethod:(NSTimer *)timer {
    static int variable = 1;

    switch (variable) {
        case 1:
            self.stopLightLabel.textColor = [UIColor redColor];
            break;
        case 2:
            self.stopLightLabel.textColor = [UIColor orangeColor];
            break;
        case 3:
            self.stopLightLabel.textColor = [UIColor yellowColor];
            break;
        case 4: // Stop for twice as long here
            self.stopLightLabel.textColor = [UIColor greenColor];

            NSTimeInterval timeBetweenNowAndFireDate = [timer.fireDate timeIntervalSinceNow];

            // Create a new date that is twice as far in the future in order to give a long pause
            timer.fireDate = [NSDate dateWithTimeIntervalSinceNow:(timeBetweenNowAndFireDate * 2)];

            break;
        case 5:
            self.stopLightLabel.textColor = [UIColor blueColor];
            break;
        case 6:
            self.stopLightLabel.textColor = [UIColor purpleColor];
            break;
        default:
            break;
    }

    variable++;
}

我试图获得从现在到计时器触发之间的时间量。在上面的例子中,这应该是 0.5 。然后我将 fireDate 设置为一个新值,该值是前一个值的两倍。

然而,这不起作用。

没有这个条件,计时器正常工作,但在某种情况下显然不会延迟(在这种情况下,它获得与其他所有时间相同的时间)。

有了条件,它甚至看起来更短!事实上,它不会变长,直到我乘以 400 左右而不是 2!

我在这里做错了什么?

最佳答案

您调用代码来修改 timerFired 方法中的 fireDate。那太早了。 fireDate 是计时器 DID 在那里触发的日期。它尚未更新。

一个简单的解决方法:将其包装在调度异步中。在您尝试修改它之前,让计时器返回并更新其 fireDate:

固定代码:

- (void)timerMethod:(NSTimer *)timer {
    static int variable = 1;

    dispatch_async(dispatch_get_main_queue(), ^{
        [self afterTimerFired:timer];
    }
 }

- (void)afterTimerFired:(NSTimer *)timer {
    static int variable = 1;
        switch (variable) {

            case 4: // Stop for twice as long here
                self.stopLightLabel.textColor = [UIColor greenColor];
                ...
                NSTimeInterval timeBetweenNowAndFireDate = [timer.fireDate timeIntervalSinceNow];
                NSLog(@"%f", timeBetweenNowAndFireDate);
                // Create a new date that is twice as far in the future in order to give a long pause
                timer.fireDate = [NSDate dateWithTimeIntervalSinceNow:(timeBetweenNowAndFireDate * 2)];
                ...

要么

不要调度 async 和 make
如果可能的话,fireDate = [NSDate dateWithTimeIntervalSinceNow:fire.timeInterval*2] 可能会更干净

关于ios - 将 NSTimer 的 fireDate 的时间加倍,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22275958/

10-13 04:07