设置小部件的TimelineProvider刷新间隔

问题描述

现在,我的Widget每秒大约发出1个请求。 我想在1小时内将其更改为1个请求。

我在使用@IBOutlet weak var sliderTime: UiSlider! @IBOutlet var labelTime: UILabel! var timer = Timer() var dateFormatter = DateFormatter() override func viewDidLoad() { dateFormatter.timeStyle = .short labelTime.text = dateFormatter.string(from: Date()) timer = Timer.scheduledTimer(timeInterval: 60,target: self,selector: #selector(updateTimeLabel),userInfo: nil,repeats: true); } @objc func updateTimeLabel() { labelTime.text = dateFormatter.string(from: Date()) } @IBAction func changeTime(_ sender: Any) { } 时遇到一些错误,例如let timeline = ...等。

任何建议可能有什么问题

Value of optional type 'Date?' must be unwrapped to a value of type 'Date'

解决方法

您不应该依赖TimelineReloadPolicy -它指定了刷新时间轴的最早时间 ,这不能保证它在该特定时间重新加载。

根据我的观察,小部件更有可能使用atEnd策略重新加载时间轴。

指定WidgetKit请求新时间轴的策略 时间轴中最后一个日期过去之后。

这是一个可能的解决方案:

func getTimeline(in context: Context,completion: @escaping (Timeline<Entry>) -> Void) {
    print("getTimeline")
    let entries = [
        SimpleEntry(date: Date()),SimpleEntry(date: Calendar.current.date(byAdding: .minute,value: 1,to: Date())!),]

    let timeline = Timeline( entries: entries,policy: .atEnd)
    completion(timeline)
}

请注意,最后一个条目可能会或可能不会使用。如果时间轴在第二个条目的日期之后立即刷新,则不会显示第二个条目。但是,有时可能会延迟加载时间轴-则第二个条目将可见(直到刷新时间轴)。