Swift 在MVVM体系结构中实现NSTimer

Swift 在MVVM体系结构中实现NSTimer,swift,mvvm,nstimer,Swift,Mvvm,Nstimer,我想实现一个NSTimer来显示一个使用NSTimeInterval的计时器,所以我环顾四周发现了以下代码,并将其放入我的ViewModel层中: public class ViewModel { public func startTimer() { //if !timer.valid { timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: #selector(updateTi

我想实现一个NSTimer来显示一个使用NSTimeInterval的计时器,所以我环顾四周发现了以下代码,并将其放入我的ViewModel层中:

public class ViewModel {

public func startTimer() {
    //if !timer.valid {
    timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
    startTime = NSDate.timeIntervalSinceReferenceDate()
    //}
}

@objc public func updateTime() -> String {
    let currentTime = NSDate.timeIntervalSinceReferenceDate()

    //Find the difference between current time and start time.

    var elapsedTime: NSTimeInterval = currentTime - startTime

    //calculate the minutes in elapsed time.

    let minutes = UInt8(elapsedTime / 60.0)

    elapsedTime -= (NSTimeInterval(minutes) * 60)

    //calculate the seconds in elapsed time.

    let seconds = UInt8(elapsedTime)

    elapsedTime -= NSTimeInterval(seconds)

    //add the leading zero for minutes, seconds and millseconds and store them as string constants

    let strMinutes = String(format: "%02d", minutes)
    let strSeconds = String(format: "%02d", seconds)

    //concatenate minuets, seconds and milliseconds as assign it to the UILabel

    return "\(strMinutes):\(strSeconds)"
}
}
我想在视图上显示当前经过的时间,因此尝试了此操作,但无效:

viewModel?.startTimer()
timerLabel.text = viewModel?.updateTime()

如何在ViewController标签上显示
updateTime()
的最新结果?

方法不能只返回字符串。它必须启动相关标签的更新。您可以对它进行编码以直接更新标签,也可以提供一个闭包,当它具有字符串值时,
updateTime
将调用该闭包。

我尝试实现Rob的答案,但是在MVVM体系结构中无法真正掌握CAdisplayLink,并且在不同的视图中周期性地更新GUI元素时遇到了同样的问题。 但是,我使用了我的RAC知识,创建并传递了一个
RACSignal
来更新我的ViewController:

RACSignal.interval(1.0, onScheduler: .mainThreadScheduler()).subscribeNext({ _ in
                self.timerLabel.text = self.viewModel?.updateTime()
            })

FWIW,没有必要每0.01秒运行一次计时器,因为屏幕刷新速度上限为60fps。我可能建议使用
CADisplayLink
而不是
NSTimer
。另外,您可能不希望自己计算所用时间并像这样构建字符串,而是希望将
nsdatecomponents格式设置器
格式设置器一起使用。allowedUnits=[.Minute,.Second]
formatter.unitsStyle=.Positional
,以及
formatter.zeroFormattingBehavior=.Pad
。然后,要更新计时器/显示链接处理程序中的标签,只需
timerLabel.text=formatter.stringFromDate(startDate,toDate:NSDate())