问题描述
我创建了一个小部件,我希望每三秒钟更新一次。
struct WidgetModel : TimelineEntry
{
var date: Date
var data: [Data]
}
func getTimeline(in context: Context,completion: @escaping (Timeline<WidgetModel>) -> Void)
{
let controller = DataController()
controller.refresh()
let nextRefresh = Calendar.current.date(byAdding: .second,value: 3,to: Date())!
let model = WidgetModel(date: nextRefresh,data: controller.data)
let timeline = Timeline(entries: [model],policy: .atEnd)
completion(timeline)
}
但是,这三秒钟将被忽略。模拟器始终显示下次刷新将在五分钟内完成。我也尝试使用.after而不是.atEnd,但这没有任何效果。 最小值是五分钟,还是与模拟器有关?
解决方法
WWDC Meet WidgetKit“小部件不是一秒钟的操作...'https://developer.apple.com/videos/play/wwdc2020-10028/?time=1099
WidgetKit旨在不影响用户设备的性能。它通过最小化刷新和URLSession请求来做到这一点。 Apple使用有关小部件使用情况和可见性的指标来决定允许您的应用进行多少处理。不支持基于秒的刷新。
您需要预先创建一个带有小部件所有视图的时间线。他们建议您在Apple的WWDC视频中提前创建一整天的时间表。创建时间轴后,您可以使用.atEnd或.after策略来请求新的时间轴。如果您的主应用程序发生了某些变化,您可以要求刷新时间表。