reloadTimeline()不会更新复杂性

时间:2016-06-29 11:15:32

标签: watchkit apple-watch-complication clockkit watch-os-3 wkrefreshbackgroundtask

我试图制作一个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)
    }
}

1 个答案:

答案 0 :(得分:5)

您当前的方法:

那里有watchOS 2和watchOS 3的混合方法。

  • WKApplicationRefreshBackgroundTask(新的watchOS 3方法)
    1. DataProvider启动异步传输(旧的watchOS 2方法,假设它在前台,而不是后台)。
      • 后台线程(后台任务可能暂停但尚未完成)在异步传输完成后期望后台任务处理完成。

简而言之,您希望后台刷新任务在后台等待异步传输。这有点令人费解(因为刷新任务应该是在后台工作,而不是等待完成其他工作)。

watchOS 3的更好方法:

由于可以暂停异步传输,因此最好使用URLSession后台传输。

  

始终使用URLSession后台传输上传和下载数据。后台传输在单独的过程中进行。即使您的应用已终止,他们仍会继续传输数据。另一方面,异步上传和下载会随您的应用暂停。鉴于watchOS应用程序的运行时间较短,您无法保证在应用程序暂停之前完成异步传输。

通过让WKURLSessionRefreshBackgroundTask响应后台传输,您的扩展程序可以在后台会话完成后被唤醒,将该会话的数据移交给数据提供者,然后更新并发症。

有关数据提供者的建议:

似乎有责任传输数据和提供数据。您可能需要考虑将网络部分拆分为单独的组件,并简单地将其作为数据存储库。

我得到的印象是,它意味着某种形式的单身人士(在幕后)但你将一个实例初始化为DataProvider()

从可读性的角度来看,从提供的代码中可以看出,复杂数据源将使用与接收数据的数据提供者相同的数据提供者。

你应该避免强制解包选项:

activeComplications为零时(例如在上次更新和此次更新之间从表盘中删除并发症时),您的代码将无意中崩溃。

您应该使用guardif let来首先检查您是否仍有活跃的并发症。