Метка обновления таймера 1 секунда позади 2-го таймера обратного отсчета - PullRequest
0 голосов
/ 09 марта 2019

У меня трудности с попыткой связать два таймера вместе.Я пытаюсь получить таймер обратного отсчета от указанной суммы и второй таймер постоянно обновляет метку на контроллере представления.Тем не менее, я получаю таймер, который обновляет метку, отставая ровно на 1 секунду от первого таймера в классе таймеров.Вот что у меня есть для контроллера представления: (обратите внимание, что это сжатая версия моего кода)

class HomeViewController: UIViewController {
    @IBOutlet var timeLabel: UILabel!

    override func viewDidLoad() {
        timeLabel.text = account.deedManager.globalTimer.timerStr

        Timer.scheduledTimer(timeInterval: 0.05, target: self, selector: #selector(UpdateTime), userInfo: nil, repeats: true)
    }

    @objc func UpdateTime() {
            self.timeLabel.text = account.deedManager.globalTimer.timerStr
    }
}

А вот класс Timer:

class TimerModel: NSObject, NSCoding {
    var myTimer: Timer? = Timer()
    var timerInterval: TimeInterval = 1.0
    var timerEnd: TimeInterval = 0.0
    var timerCount: TimeInterval = 86400.0 // 24 hours
    var timerStr: String = "TIME"

    func StartTimer(time: Double) {
        timerCount = time
        myTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(UpdateTime), userInfo: nil, repeats: true)
    }

    @objc func UpdateTime() {
        self.timerStr = self.TimerDate(time: self.timerCount)
        self.timerCount-=1
        print(self.timerStr)
    }

    func TimerDate(time:TimeInterval) -> String {
        let hours = Int(time) / 3600
        let minutes = Int(time) / 60 % 60
        let seconds = Int(time) % 60
        return String(format: "%02i:%02i:%02i", hours, minutes, seconds)
    }
}

Я пробовалсделать первый таймер интервалом 0,05, чтобы он обновлялся быстрее, чем класс таймера, но он отстает ровно на секунду, независимо от того, на каком интервале я его установил.Я не хочу помещать таймер обратного отсчета внутри контроллера представления, поскольку я хочу, чтобы таймер был глобальным для всех контроллеров представления.Если у вас есть идеи, дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Сначала вам нужно изменить порядок так, чтобы вы устанавливали текст после уменьшения timerCount:

@objc func UpdateTime() {
    self.timerCount-=1
    self.timerStr = self.TimerDate(time: self.timerCount)
    print(self.timerStr)
}

Затем вы можете удалить таймер на 0,05 секунды, потому что, как вы сказали, это не работает.

Попробуйте вместо этого использовать шаблон делегата.

protocol TimerModelDelegate {
    func timerTextDidChange(_ timer: TimerModel, text: String)
}

А потом в TimerModel,

weak var delegate: TimerModelDelegate?
var timerStr: String = "TIME" {
    didSet {
        delegate?.timerTextDidChange(self, text: timerStr)
    }
}

В HomeViewController сделайте следующее:

class HomeViewController: UIViewController, TimerModelDelegate {
    @IBOutlet var timeLabel: UILabel!

    override func viewDidLoad() {
        timeLabel.text = account.deedManager.globalTimer.timerStr
        account.deedManager.globalTimer.delegate = self
        account.deedManager.globalTimer.StartTimer(time: 60)
    }

    // You don't need the UpdateTime method here

    func timerTextDidChange(_ timer: TimerModel, text: String) {
        timeLabel.text = text
    }
}
0 голосов
/ 09 марта 2019

У вас есть эта функция:

@objc func UpdateTime() {
    self.timerStr = self.TimerDate(time: self.timerCount)
    self.timerCount-=1
    print(self.timerStr)
}

Заменить на

@objc func UpdateTime() {
    self.timerCount-=1
    self.timerStr = self.TimerDate(time: self.timerCount)
    print(self.timerStr)
}

Пояснение: Сначала вам нужно изменить значение, затем показать это

Обратите внимание, что первые две строки поменялись местами. Это должно исправить вашу проблему.

...