提供 Widget 时间线时如何处理错误?

问题描述

我正在构建一个小部件,它将显示从后端获取内容,该内容将提供接下来 7 天每天的数据。因此,我计划创建一个时间表,其中包含每个日期一个条目的数组,并将重新加载策略设置为 atEnd,以便在用完后获取接下来的 7 天。

我想知道如何处理可能发生的错误。例如,如果没有互联网连接,您将无法获取数据来创建时间轴,那么您应该如何处理它并确保它稍后会再次尝试获取

如果您通过 Timeline(entries: [],policy: .atEnd) 调用带有空条目数组和重新加载策略的完成,它什么时候会自动再次尝试获取条目,还是永远不会?这是否会继续显示最后一个可用的小部件条目(快照/占位符,如果没有的话)?

也许应该在小部件中向用户显示一条错误消息。您可以为此创建一个条目。那么剩下的唯一问题是你如何确保它会重试获得一个真正的时间表?也许在未来使用日期 x 分钟数的后日期策略?不过系统速率限制会重新加载,如果后端一直失败,您不希望太频繁地访问后端。

Apple 确实有 sample code,它通过以下方式实现了通过可失败异步请求填充的时间线:

func getTimeline(in context: Context,completion: @escaping (Timeline<leaderboardEntry>) -> Void) {
    CharacterDetail.loadleaderboardData { (characters,error) in
        guard let characters = characters else {
            let timeline = Timeline(entries: [leaderboardEntry(date: Date(),characters: CharacterDetail.availableCharacters)],policy: .atEnd)
            
            completion(timeline)
            
            return
        }
        let timeline = Timeline(entries: [leaderboardEntry(date: Date(),characters: characters)],policy: .atEnd)
        completion(timeline)
    }
}

这里如果加载排行榜数据失败,它会返回一个带有当前日期的条目,并将重新加载策略设置为结束。所以它会立即显示所有可用的字符,然后时间线耗尽,因此系统需要获取更多的时间线条目,但什么时候会发生?这段代码似乎向系统建议它需要不断地获取新的时间线条目(即使在成功状态下),不是吗?这似乎不对。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)