如何处理iOS 14小部件中的API故障

如何处理iOS 14小部件中的API故障,ios,swift,widgetkit,Ios,Swift,Widgetkit,我正在构建一个小部件,它显示从API获得的简单预订列表。我已经从getTimeline方法设置了API调用,如很多教程所示,但是没有一个教程介绍调用出现问题时该怎么做 func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) { NetworkManager().getT

我正在构建一个小部件,它显示从API获得的简单预订列表。我已经从
getTimeline
方法设置了API调用,如很多教程所示,但是没有一个教程介绍调用出现问题时该怎么做

func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
    
    NetworkManager().getTimelineEntries { result in
        switch result {
        case .success(let entries):
            let timeline = Timeline(entries: entries, policy: .atEnd)
            completion(timeline)
        case .failure(let error):
            print(error.localizedDescription)
        }
    }
func getTimeline(对于配置:configurationcontent,在上下文:context中,完成:@escaping(Timeline)->()){
NetworkManager().getTimelineEntries{导致
切换结果{
成功案例(请输入):
let timeline=timeline(条目:条目,策略:.atEnd)
完成(时间表)
案例。失败(let错误):
打印(错误。本地化描述)
}
}
我们正在使用存储在密钥链中的登录凭据,如果用户未登录,我希望显示一个静态视图(凭据为空)。如果用户已登录,但请求失败或返回零项,我还希望显示一个静态视图


由于API调用目前是在
getTimeline
方法中执行的,我不确定处理这些情况的最佳方法。我可以返回一个配置为显示自定义消息的时间线条目,但这似乎不是最佳方法,必须有更好的方法来处理。对于未登录的用户,这似乎是错误的g当我们知道API调用将失败时,是否有办法在时间线提供程序之外处理此问题?

最简单的方法是返回一个带有单个空状态/占位符的
时间线
/“哎呀,出了问题!”
条目
并在15分钟后请求一个新的时间线(您可以在较短的时间间隔后请求刷新,例如5分钟,但是):

func getTimeline(对于配置:configurationcontent,在上下文:context中,完成:@escaping(Timeline)->()){
NetworkManager().getTimelineEntries{导致
切换结果{
成功案例(请输入):
let timeline=timeline(条目:条目,策略:.atEnd)
完成(时间表)
案例。失败(let错误):
让currentDate=Date()
let entries=[Entry(date:currentDate,yourData:nil)]//可以在此处包含错误,以显示在小部件UI上
让策略=.after(Calendar.current.date)(通过添加:.minute,值:15,to:currentDate)??currentDate.addingTimeInterval(900))
让时间线=时间线(条目:条目,策略:策略)
完成(时间表)
}
}
}

这基本上是我自己想出的解决方案是的,谢谢。我的
TimelineEntry
结构有一个可选数据和一个可选错误参数,所以我有3个条件,有效输入、错误输入或无数据(意味着我们平台上没有预订)。然后,我根据错误类型设置了刷新策略,例如,如果用户注销,则策略为
。永远不要
,因为用户下次登录时会重新加载时间线。在我看来,似乎没有一种机制来处理小部件体系结构中内置的错误。谢谢苹果。你真是太疯狂了告诉我,@Leon,特别恼人的是在Widget视图(模型)之外尝试异步加载多个不同的图像-基本上你必须在
NetworkManager()中进行所有预取
在第一次点击api获取资产URL后进行编码…更不用说
WidgetKit
中的布局错误/限制…在WidgetKit方面,苹果有太多古怪的选择。我在让Firebase在小部件内部工作时遇到了麻烦,所以我不得不依靠我的应用程序中的黑客来获取我想要的分析信息/U圣人。