繁体   English   中英

在Objective-C中使用for循环减慢NSTimer

[英]Slow down NSTimer with a for loop in Objective-C

我有一个按钮,当按下该按钮时,它会以一定的频率生成由NSTimer触发的随机数,释放时,我希望它继续生成它们,直到停止为止,它越来越慢。

- (void)buttonPressed {


_timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(generateNumber) userInfo:nil repeats:YES];


}

- (void)buttonReleased {

if ([_timer isValid]) {
    [_timer invalidate];
}
_timer = nil;



for (float i=0.20; i<1; i += 0.1) {
    _timer = [NSTimer scheduledTimerWithTimeInterval:i target:self selector:@selector(generateNumber) userInfo:nil repeats:NO];
}

}

当按下按钮时,它可以正常工作,但是一旦释放,它实际上会加速,然后突然停止。 知道为什么它不起作用或以其他方式可以达到想要的结果吗?

释放按钮后,生成速度会加快,因为那时您计划了8个定时器,间隔时间分别为按钮释放时的0.2、0.3、0.4、0.5、0.6、0.7、0.8和0.9,这意味着每个定时器将在按钮释放后执行0.1s其他时间间隔比原始计时器(0.2s)小。

这是另一种选择

@interface ViewController ()
@property (nonatomic, retain) NSTimer *timer;
@property (nonatomic) float curInterval;
@end

@implementation ViewController

- (IBAction)buttonDown {
    self.curInterval = 0.1;
    [self updatePressed];
}

- (void)updatePressed {
    [self generateNumber];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:self.curInterval target:self selector:@selector(updatePressed) userInfo:nil repeats:NO];
}

- (IBAction)buttonUp {
    [self.timer invalidate];
    [self updateUp];
}

- (void)updateUp {
    [self generateNumber];
    self.curInterval += 0.1;
    if (self.curInterval < 1.0f) {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:self.curInterval target:self selector:@selector(updateUp) userInfo:nil repeats:NO];
    }
}
@end

在Button释放方法中,您使用的是for循环,该循环一直执行直到达到间隔1。您需要做的是获取一个全局float值,并在开始时将其初始化为0.20。 按下按钮时传递该值。 释放按钮时,递增全局变量并将该值传递给NSTimer而不是for循环

float numTimer = 0.20f;

- (void)buttonPressed { 
    _timer = [NSTimer scheduledTimerWithTimeInterval:numTimer target:self selector:@selector(generateNumber) userInfo:nil repeats:YES]; 
}


- (void)buttonReleased { 
    if ([_timer isValid]) { 
        [_timer invalidate]; 
    } 
    _timer = nil;
    numTimer = numTimer + 0.1f;
    _timer = [NSTimer scheduledTimerWithTimeInterval:numTimer target:self selector:@selector(reGenerateNumber) userInfo:nil repeats:NO]; }
 }

-(void) reGenerateNumber {
     [self generateNumber];
     if ([_timer isValid]) { 
        [_timer invalidate]; 
     } 
    _timer = nil;
    numTimer = numTimer + 0.1f;
    _timer = [NSTimer scheduledTimerWithTimeInterval:numTimer target:self selector:@selector(reGenerateNumber) userInfo:nil repeats:NO]; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM