gpt4 book ai didi

ios - 定时器更新标签比第二个定时器倒计时晚 1 秒

转载 作者:行者123 更新时间:2023-11-29 05:56:48 25 4
gpt4 key购买 nike

我在尝试将两个计时器链接在一起时遇到困难。我试图让计时器从指定的数量开始倒计时,并让第二个计时器不断更新 View Controller 上的标签。然而,我最终发现更新标签的计时器落后于计时器类中的第一个计时器整整 1 秒。这是我的 View Controller :(请注意,这是我的代码的精简版本)

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 的间隔,以便它比计时器类更新得更快,但无论我将其设置为什么间隔,它都会准确地落后一秒。我不想将倒计时器放在 View Controller 内,因为我希望所有 View Controller 都有全局计时器。如果您有任何想法,请告诉我。

最佳答案

首先,您需要切换顺序,以便在递减 timerCount 后设置文本:

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

然后,您可以删除 0.05 秒计时器,因为正如您所说,这似乎不起作用。

尝试使用委托(delegate)模式。

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

关于ios - 定时器更新标签比第二个定时器倒计时晚 1 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55074556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com