我试图制作一个watchOS 3应用,我想在后台任务中更新我的复杂功能。
首先,我在handle()
内的后台任务中从服务器获取新数据。之后,我通过致电complicationServer.reloadTimeline(for:)
来更新我的活动并发症。
在控制台中,我确实看到了消息" UPDATE COMPLICATION,"所以代码被执行。
然而,重新加载后,复杂功能仍然显示旧数据。如果我切换表盘并切换回来,那么复杂功能有时会重新加载。我是否必须做其他事情才能从后台任务中重新加载复杂功能?
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
for task : WKRefreshBackgroundTask in backgroundTasks {
if (WKExtension.shared().applicationState == .background) {
if task is WKApplicationRefreshBackgroundTask {
let dataProvider = DataProvider()
dataProvider.getData(station: "Name", completion: { (data, error) in
self.updateComplication()
self.scheduleNextBackgroundRefresh()
task.setTaskCompleted()
})
}
} else {
task.setTaskCompleted()
}
}
}
func updateComplication() {
let complicationServer = CLKComplicationServer.sharedInstance()
for complication in complicationServer.activeComplications! {
print("UPDATE COMPLICATION")
complicationServer.reloadTimeline(for: complication)
}
}
答案 0 :(得分:5)
您当前的方法:
那里有watchOS 2和watchOS 3的混合方法。
简而言之,您希望后台刷新任务在后台等待异步传输。这有点令人费解(因为刷新任务应该是在后台工作,而不是等待完成其他工作)。
watchOS 3的更好方法:
由于可以暂停异步传输,因此最好使用URLSession
后台传输。
始终使用URLSession后台传输上传和下载数据。后台传输在单独的过程中进行。即使您的应用已终止,他们仍会继续传输数据。另一方面,异步上传和下载会随您的应用暂停。鉴于watchOS应用程序的运行时间较短,您无法保证在应用程序暂停之前完成异步传输。
通过让WKURLSessionRefreshBackgroundTask
响应后台传输,您的扩展程序可以在后台会话完成后被唤醒,将该会话的数据移交给数据提供者,然后更新并发症。
有关数据提供者的建议:
似乎有责任传输数据和提供数据。您可能需要考虑将网络部分拆分为单独的组件,并简单地将其作为数据存储库。
我得到的印象是,它意味着某种形式的单身人士(在幕后)但你将一个实例初始化为DataProvider()
。
从可读性的角度来看,从提供的代码中可以看出,复杂数据源将使用与接收数据的数据提供者相同的数据提供者。
你应该避免强制解包选项:
当activeComplications
为零时(例如在上次更新和此次更新之间从表盘中删除并发症时),您的代码将无意中崩溃。
您应该使用guard
或if let
来首先检查您是否仍有活跃的并发症。