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