计时器更新标签在第二计时器倒数第二秒之后

时间:2019-03-09 06:11:31

标签: ios swift nstimer countdown

我很难将两个计时器链接在一起。我正在尝试使计时器从指定的数量开始递减,并让第二个计时器不断更新视图控制器上的标签。但是,最后我得到了一个计时器,该计时器在计时器类中的第一个计时器之后精确地滞后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 :(得分:0)

您具有此功能:

@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)
}

说明: 您首先必须更改该值,然后显示

请注意,前两行已互换。这应该可以解决您的问题。

答案 1 :(得分:0)

首先,您需要切换顺序,以便在减小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
    }
}