不能每分钟刷新一次WidgetView

问题描述

我无法每分钟刷新一次小部件。这是我的getTimeline函数

let currentDate = Date()
let refreshDate = Calendar.current.date(byAdding: .minute,value: 1,to: currentDate)!
guard let widget = try? JSONDecoder().decode([myWidgets].self,from: widgetData)
let entry = widgetEntry(date: Date(),widget: widget[0])
let timeline = Timeline(entries: [entry],policy: .after(refreshDate))
completion(timeline)
WidgetCenter.shared.reloadAllTimelines()

我还尝试每秒刷新一次,只刷新显示当前时间的日期,但是几秒钟后它停止刷新。

然后我在下面的@ pawello2222中尝试了此代码,但是窗口小部件无法正确加载它;

    var entries = [widgetEntry]()
    let currentDate = Date()
    let midnight = Calendar.current.startOfDay(for: currentDate)
    let nextMidnight = Calendar.current.date(byAdding: .day,to: midnight)!

    for offset in 0 ..< 60 * 24 {
        guard let widget = try? JSONDecoder().decode([myWidgets].self,from: widgetData)
        let entryDate = Calendar.current.date(byAdding: .minute,value: offset,to: midnight)!
        entries.append(widgetEntry(date: entryDate,widget: widget[0]))
    }

    let timeline = Timeline(entries: entries,policy: .after(nextMidnight))
    completion(timeline)

解决方法

我还尝试每秒刷新一次,只将日期更新为 显示当前时间,但几秒钟后停止刷新。

您的窗口小部件只能使用有限数量的刷新。如果您每秒调用WidgetCenter.shared.reloadAllTimelines(),则您的小部件可能很快就会耗尽可用的更新。


此外,您不应在reloadAllTimelines()中致电getTimeline()

...
completion(timeline)
WidgetCenter.shared.reloadAllTimelines() // remove this

然后我在下面的@ pawello2222中尝试了此代码,但小部件不是 正确加载

我假设您是指以下答案:Updating time text label each minute in WidgetKit

请注意,您的代码guard let可能不会通过:

for offset in 0 ..< 60 * 24 {
    guard let widget = try? JSONDecoder().decode([myWidgets].self,from: widgetData) // you need `else { ... return }` here
    let entryDate = Calendar.current.date(byAdding: .minute,value: offset,to: midnight)!
    entries.append(widgetEntry(date: entryDate,widget: widget[0]))
}

请参阅:When to use guard let rather than if let