UIKit Swift 5:如何每分钟更新一次UI

qoefvg9y  于 9个月前  发布在  Swift
关注(0)|答案(2)|浏览(86)

我正在尝试更新UI上的倒计时计时器,它以分钟为单位倒计时,所以我需要更新它 * 每一分钟的开始 *,这与每分钟更新不一样。我目前的解决方案是初始化一个定时器,每十分之一秒调用一次updateUI()函数,这远非理想:
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector:#selector(TimesViewController.updateUI), userInfo: nil, repeats: true)
有没有一种方法可以在每一分钟开始时调用该函数?

j13ufse2

j13ufse21#

创建计时器,每秒检查系统日期。比如说;

Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (_) in
    let second = Calendar.current.component(.second, from: Date())
    if second == 0 {
        // new minute
        updateUI()
    }
}
vm0i2vca

vm0i2vca2#

如果你想精确到每分钟只触发一次计时器...
将此扩展添加到Calendar以计算下一分钟的开始:

extension Calendar {
    
    func startOfNextMinute(after startDate: Date = Date()) -> Date {
        let components = dateComponents([.year, .month, .day, .hour, .minute], from: startDate)
        guard let startOfCurrentMinute = Calendar.current.date(from: components) else { fatalError("\(#function) Unable to create valid Date") }
        guard let startOfNextMinute = date(byAdding: .minute, value: 1, to: startOfCurrentMinute) else { fatalError("\(#function) Unable to create valid Date") }
        return startOfNextMinute
    }
}

然后像这样设置Timer

private var timer: Timer?

func setNextUpdateTimer() {
    timer?.invalidate()
    let startOfNextMinute = Calendar.current.startOfNextMinute()
    
    timer = Timer(fire: startOfNextMinute, interval: 0, repeats: false, block: { _ in
        // call your update action here
        self.setNextUpdateTimer()
    })
    
    if let configuredTimer = timer {
        configuredTimer.tolerance = 0.2
        RunLoop.main.add(configuredTimer, forMode: .common)
    }
}

注:当不再需要Timer时,请确保调用timer?.invalidate()以防止计时器再次触发,并将其从RunLoop中删除。在deint所属的类中可以很好地执行此操作:

deinit {
    timer?.invalidate()
}

相关问题