Как обрабатывать ошибки при предоставлении временной шкалы виджета?

#ios #widget #ios14 #widgetkit

Вопрос:

Я создаю виджет, который будет отображать контент, извлеченный из бэкэнда, который будет предоставлять данные за каждый день в течение следующих 7 дней. Поэтому я планирую создать временную шкалу с массивом записей по одной для каждой даты и политикой перезагрузки, настроенной на atEnd получение следующих 7 дней после исчерпания.

Мне интересно, как справиться с ошибками, которые могут возникнуть. Например, если нет подключения к Интернету, вы не получите данные для создания временной шкалы, так что вы должны сделать, чтобы обработать их и убедиться, что они попытаются получить их позже?

Если вы вызовете завершение с пустым массивом записей и политикой перезагрузки в конце, Timeline(entries: [], policy: .atEnd) когда он автоматически попытается снова получить записи или никогда не будет? Будет ли это просто продолжать отображать последнюю доступную запись виджета (снимок/заполнитель, если он никогда не появлялся)?

Возможно, вместо этого следует отобразить сообщение об ошибке для пользователя в виджете. Для этого вы можете создать единственную запись. Тогда остается единственный вопрос: как вы гарантируете, что он повторит попытку, чтобы получить реальную временную шкалу? Может быть, использовать политику после даты с датой x количество минут в будущем? Однако системные ограничения скорости перезагружаются, и вы не хотите слишком часто подключаться к серверной части, если она продолжает отказывать.

У Apple есть пример кода, который реализует временную шкалу, заполненную с помощью асинхронного запроса с возможностью сбоя через:

 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)
    }
}
 

Здесь, если ему не удается загрузить данные таблицы лидеров, он возвращает одну запись с текущей датой и устанавливает политику перезагрузки в конце. Таким образом, он немедленно отобразит все доступные символы, а затем временная шкала будет исчерпана, поэтому системе необходимо получить больше записей временной шкалы, но когда это произойдет? Этот код, по-видимому, подсказывает системе, что ей необходимо постоянно получать новые записи временной шкалы (даже в состоянии успеха), нет? Это кажется неправильным.