【发布时间】:2020-11-14 00:29:33
【问题描述】:
我目前正在为我的应用程序创建我的第一个小部件。 数据是通过 API 调用获得的。我想知道是否可以从应用程序发出此请求,然后将此请求的结果发送到小部件? (有点像 WatchConnectivity 对手表的作用)
感谢您的帮助:-)
【问题讨论】:
-
这可能对你有帮助:How to refresh Widget data?
我目前正在为我的应用程序创建我的第一个小部件。 数据是通过 API 调用获得的。我想知道是否可以从应用程序发出此请求,然后将此请求的结果发送到小部件? (有点像 WatchConnectivity 对手表的作用)
感谢您的帮助:-)
【问题讨论】:
通常小部件不应该直接从应用程序接收任何数据。小部件有一个TimelineProvider 的概念,它生成一个由时间线条目组成的时间线。每个条目都指定更新小部件内容和内容本身的日期和时间。如果需要从服务器获取内容,您可以在时间线提供者的方法中使用标准的URLSession API,并将数据附加到时间线条目。这就是为什么时间线提供者在其方法中将完成处理程序作为参数:
func getTimeline(in: Self.Context, completion: (Timeline<Self.Entry>) -> Void)
WidgerCenter API(recloadAllTimelines() 或reloadTimelines(ofKind:))应该用于通知WidgetKit 当时间线发生变化时。例如,当用户在主应用程序中更改某些内容,向后端发送请求,使用新信息更新数据库时,您需要启动小部件更新以及获取更新的数据并刷新。
【讨论】:
是的,这可以使用WidgetCenter API 之一重新加载您的时间线。
...
// make API call
// store data in shared storage that the Widget uses
WidgetCenter.shared.reloadAllTimelines()
// OR
WidgetCenter.shared.reloadTimelines(ofKind: "WidgetKind")
请注意,最有可能使用reloadTimelines(ofKind: "WidgetKind"),因为它只会重新加载特定小部件的时间线。 “WidgetKind”可以在您的 WidgetConfiguration 定义中找到
【讨论】: