无法每分钟刷新 WidgetView

Posted

技术标签:

【中文标题】无法每分钟刷新 WidgetView【英文标题】:Can't refresh WidgetView every minute 【发布时间】:2020-11-05 06:56:24 【问题描述】:

我无法每分钟都刷新我的小部件。这是我的 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)

【问题讨论】:

这是否回答了您的问题***.com/a/64086553/12299030? @Asperi 我尝试了那个解决方案,没有图像,一切都很好。但是当我将背景图像甚至系统图像放在 HStack 上时,它不会呈现,只有占位符。 我在您的代码快照中没有看到任何图像。您会根据上面的评论提供可重现的示例吗? 【参考方案1】:

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

您的小部件只有有限数量的刷新。如果您每秒调用一次WidgetCenter.shared.reloadAllTimelines(),您的 Widget 很可能很快就会用完可用的更新。


另外,你不应该在getTimeline() 中调用reloadAllTimelines()

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

【讨论】:

我认为问题在我看来。在尝试了您的建议后,它在一个简单的视图中工作,只有图像和时间。您是否知道在 JSONDecoder 数据更改时更新小部件数据? @BaturayKoç 这取决于数据如何/何时更改。在您的问题中,没有关于 myWidgets 变量是什么的信息。我建议您创建一个新问题来描述您的问题。我会尽力帮助你。

以上是关于无法每分钟刷新 WidgetView的主要内容,如果未能解决你的问题,请参考以下文章

如何每“t”分钟刷新一次 JWT 令牌?

PFQueryTableView 在新数据更新或每分钟使用 Parse 刷新时自动刷新

定时器自动刷新浏览器中的 HTML 页面 - 每 15 分钟

线程每5分钟刷新一次

使用 GNU less 的 bash 循环,每 2 分钟刷新一次

Android:如何让我检索到的(来自 mysql)JSON 解析数据添加到 ListView 每分钟刷新一次