Как синхронизировать время с системными часами MacOS при использовании таймера для обновления времени? - PullRequest
1 голос
/ 27 марта 2019

Я использую этот код для отображения времени в NSLabel:

Модель

func startClock() {
    timer = Timer(timeInterval: 1.0, target: self, selector: #selector(fireAction), userInfo: nil, repeats: true)
    RunLoop.current.add(timer!, forMode: RunLoop.Mode.common)
    timer?.tolerance = 0.05
    fireAction()
}

@objc dynamic func fireAction() {
    delegate?.timeToUpdateClock(self)
}

ViewController

extension ViewController: ClockWorksProtocol {
    func timeToUpdateClock(_ timer: ClockWorks) {
        tick()
     }
}

 func tick() {
    clockDateLabel.stringValue = DateFormatter.localizedString(from: Date(), dateStyle: .full, timeStyle: .none)
    clockTimeLabel.stringValue = DateFormatter.localizedString(from: Date(), dateStyle: .none, timeStyle: .medium)
}

Кажется, все работает довольно хорошо, но, к сожалению, показанные секунды не синхронизируются с секундами, которые вы видите на часах в строке меню.Я думаю, это происходит из-за того, что я обновляю часы каждую секунду, но пользователь не щелкает, когда секундная стрелка правильна для запуска, а через случайный интервал от секунды до следующей секунды (я использую timeInterval для таймера 1.0).

Я мог бы изменить интервал времени таймера с 1,0 до 0,1 секунды.Кажется, это работает, но я боюсь, что это может потребовать слишком много ресурсов.

Я публикую два снимка экрана, сделанные одновременно.Они показывают два разных времени (секунды):

enter image description here

enter image description here

Как можно исправитьразрыв?

...