我想要实现的目标如下:
- 并发症以 30 为间隔在后台更新
分钟
- 每当手表应用程序运行时,并发症都会更新,并且
接收自己的更新数据
- 并发症随时更新
iOS 应用程序运行并且用户更改了影响的设置
观察数据(例如天气观测位置的变化,或
显示单位)
第 1 项和第 2 项似乎很简单,并且在这里得到了很好的解决:Apple Watch 复杂功能数据的更新流程是怎样的?
但是,对于第 3 项,在 iOS 应用程序中,我设置了一个 WCSession 实例并调用 TransferCurrentComplicationUserInfo,将新设置作为 NSDictionary 发送。在监视扩展中,这会调用 WCSessionDelegate 中的 didReceiveUserInfo。
- (void)session:(WCSession *)session didReceiveUserInfo:(NSDictionary<NSString *,id> *)userInfo {
// Code here to apply the new settings
// ....
// Invoke a NSUSRLSession-based web query to get new data
[self queryForNewDataWithCompletionHandler:^(NCUpdateResult result) {
if (result == NCUpdateResultNewData) {
// Have new data from web to display
CLKComplicationServer *server = [CLKComplicationServer sharedInstance];
for (CLKComplication *complication in server.activeComplications) {
[server reloadTimelineForComplication:complication];
}
}
// Set date for next complication update to 30 mins from now
// ...
}];
}
我遇到的问题是 watchOS 在调用 didReceiveUserInfo 后不久在一个单独的线程中调用 requestUpdateDidBegin ,并且在我有机会使用从应用程序新收到的 UserInfo 字典中的新设置获取更新数据之前开始执行。
因此,复杂功能在短时间内连续更新两次 - 一次是由 WatchOS 调用 requestUpdateDidBegin,它只是用现有(陈旧)数据重新更新复杂功能,然后我很快就从网络收到新数据,然后必须更新它们再次用我自己的代码。
这似乎没有必要,而且浪费资源,更不用说苹果允许的更新预算有限(据说每小时 2 次)。
我在这里做错了什么吗?在我有机会从网络获取新数据之前,如何防止 watchOS2 调用requestedUpdateDidBegin?
的目的transferCurrentComplicationUserInfo
是立即将当前的复杂数据传递给扩展。在您的代码中,您正在传递设置,但不包含任何天气数据。
您看到的问题源于尝试异步地在扩展中获取新数据(在数据可用之前返回)。
为了处理这个问题,您应该根据新设置获取手机上的当前天气数据,然后将天气数据(新设置一起)传递到当前复杂功能用户信息中。
- (void)session:(WCSession *)session didReceiveUserInfo:(NSDictionary<NSString *,id> *)userInfo {
// Code here to apply the new settings for future updates
// ....
// Code here to update cache/backing store with current weather data just passed to us
// ....
CLKComplicationServer *server = [CLKComplicationServer sharedInstance];
for (CLKComplication *complication in server.activeComplications) {
[server reloadTimelineForComplication:complication];
}
}
这样,复杂功能服务器可以使用您刚刚传输到手表的当前复杂功能数据立即更新时间线。
没有陈旧的数据,没有不必要的第二次更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)