【问题标题】:How to handle API failures in an iOS 14 Widget如何处理 iOS 14 小部件中的 API 故障
【发布时间】:2021-05-11 16:21:05
【问题描述】:

我正在构建一个小部件,它显示从 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)
        }
    }

我们正在使用存储在钥匙串中的登录凭据,如果用户未登录(凭据为空),我想显示一个静态视图。如果用户已登录但请求失败或返回零条目,我还想显示一个静态视图。

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

【问题讨论】:

    标签: ios swift widgetkit


    【解决方案1】:

    最简单的方法是返回带有单个空状态/占位符/“哎呀,出了点问题!”的TimelineEntry 并在 15 分钟后请求新的时间线(您可以在较短的间隔后请求刷新,例如 5 分钟,但 Apple may ignore depending on your refresh budget, users' device usage & widget location):

    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):
                let currentDate = Date()
                let entries = [Entry(date: currentDate, yourData: nil)] //Could include error here, to display on widget UI
                let policy = .after(Calendar.current.date(byAdding: .minute, value: 15, to: currentDate) ?? currentDate.addingTimeInterval(900))
                let timeline = Timeline(entries: entries, policy: policy)
                completion(timeline)
            }
        }
    }
    
    

    【讨论】:

    • 这基本上是我自己想出的解决方案,是的,谢谢。我的 TimelineEntry 结构有一个可选数据和一个可选错误参数,所以我有 3 个条件,有效条目、错误条目或无数据(意味着我们平台上没有预订)。然后,我根据错误类型设置了刷新策略,例如,如果用户已注销,则策略为.never,因为无论如何用户下次登录时时间线都会重新加载。对我来说似乎很疯狂,似乎没有一种机制来处理小部件架构中内置的错误。谢谢苹果。
    • 你告诉我,@Leon,特别烦人的是试图在小部件视图(模型)之外异步加载几个不同的图像 - 你基本上必须在你的 @ 中完成所有预取987654327@ 第一次点击您的 api 以获取资产 url 后的代码......更不用说 WidgetKit 中的布局错误/限制......当谈到 WidgetKit 时,Apple 有这么多古怪的选择。我无法让 Firebase 在小部件中工作,因此我不得不依靠我的应用程序中的黑客来获取我想要用于分析/使用的信息。
    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多