问题描述
我无法每分钟刷新一次小部件。这是我的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]))
}