2016-08-20 2 views
3

Я хочу реализовать NSTimer, чтобы показать хронометр с помощью NSTimeInterval, так что я посмотрел вокруг и нашел этот код, который я положил в мой ViewModel слой:Реализация NSTimer в архитектуре MVVM

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() 

Как я могу показать последний результат updateTime() на моем ViewController этикетке?

+0

FWIW, нет необходимости запускать таймер каждые 0.01 секунд, так как обновления экрана ограничены в 60fps. Вероятно, я бы предложил «CADisplayLink», а не «NSTimer». Кроме того, вместо того, чтобы самостоятельно вычислять затраченное время и строить такую ​​строку, вы можете использовать 'NSDateComponentsFormatter' с' formatter.allowedUnits = [.Minute, .Second] ',' formatter.unitsStyle = .Positional', и 'formatter.zeroFormattingBehavior = .Pad'. Затем, чтобы обновить метку в обработчике ссылок таймера/отображения, это просто 'timerLabel.text = formatter.stringFromDate (startDate, toDate: NSDate())'. – Rob

ответ

0

Метод updateTime не может просто вернуть строку. Он должен инициировать обновление данного ярлыка. Вы можете либо запрограммировать его, чтобы сразу обновить ярлык, либо вы можете предоставить закрытие, которое будет вызывать updateTime, когда оно имеет строковое значение.

0

Я попытался реализовать ответ Роба, но не смог понять суть CAdisplayLink в архитектуре MVVM и периодически возникал с той же проблемой обновления элемента GUI в другом представлении. Однако я использовал мой RAC знание и создан и прошел RACSignal обновить мой ViewController:

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