1

我正在实现倒计时,其值显示在 UILabel 上,但遇到了问题。这是简化的代码:

self.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countdown) userInfo:nil repeats:YES];

- (void)countdown {          
     self.countdownLabel.text = [NSString stringWithFormat:@"%i",[self.countdownLabel.text intValue]-1];

     // Handle time out
     if ([self.countdownLabel.text intValue] == 0) {
             [self.countdownTimer invalidate];
             self.countdownTimer = nil;
     }
}

它工作正常,但如果我在视图控制器中执行其他 UI 操作,例如滚动滚动视图,计时器会在滚动视图滚动时挂起,然后加速以弥补空闲时间。

我尝试将标签的更新分派到后台队列,这当然不起作用。

dispatch_queue_t bgQ = dispatch_queue_create("bgQ", 0);
dispatch_async(bgQ, ^{
    self.countdownLabel.text = [NSString stringWithFormat:@"%i",[self.countdownLabel.text intValue]-1];
});

这里的解决方案是什么?

4

2 回答 2

1
self.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countdown) userInfo:nil repeats:YES];    
[[NSRunLoop mainRunLoop] addTimer:self.countdownTimer forMode:NSRunLoopCommonModes];

请记住,在您的倒计时方法中,您需要一个转义来使您的倒计时计时器无效。

计时器将在没有触发指令的情况下启动

[[NSRunLoop mainRunLoop] addTimer:self.countdownTimer forMode:NSRunLoopCommonModes];

行被执行。绝对没有针对 UI 更改的调度异步。

希望这可以帮助。

于 2013-03-10T11:10:17.610 回答
1

Swift 3.0 语法

var timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.updateTimer), userInfo: nil, repeats: true);
RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)
于 2017-06-02T09:52:16.980 回答