无法每分钟刷新 WidgetView

Can't refresh WidgetView every minute

我不能每分钟都刷新我的小部件。这是我的 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, value: 1, 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)

I also tried refreshing every second with only refresing the date to show current time, but its stops refreshing after couple of seconds.

您的 Widget 可用的刷新 次数有限。如果您每秒调用 WidgetCenter.shared.reloadAllTimelines(),您的 Widget 可能会很快 运行 失去可用更新。


此外,您不应该在 getTimeline() 中调用 reloadAllTimelines():

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

Then I tried this code below from @pawello2222 but widgets are not loading correctly with it

我假设您指的是这个答案:

请注意,在您的代码中 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