Виджет WidgetKit не позволяет обновлять временную шкалу каждые три секунды
Я создал виджет, который хочу обновлять каждые три секунды.
У меня такой код:
struct WidgetModel : TimelineEntry
{
var date: Date
var data: [Data]
}
func getTimeline(in context: Context, completion: @escaping (Timeline<WidgetModel>) -> Void)
{
let controller = DataController()
controller.refresh()
let nextRefresh = Calendar.current.date(byAdding: .second, value: 3, to: Date())!
let model = WidgetModel(date: nextRefresh, data: controller.data)
let timeline = Timeline(entries: [model], policy: .atEnd)
completion(timeline)
}
Однако три секунды будут проигнорированы. Симулятор всегда показывает, что следующее обновление будет через пять минут. Я также пробовал использовать.after вместо.atEnd, но это не дало никакого эффекта. Минимальное значение - пять минут или это связано с симулятором?
1 ответ
WWDC Meet WidgetKit "Виджеты - это не ежесекундная операция..." https://developer.apple.com/videos/play/wwdc2020-10028/?time=1099
WidgetKit разработан так, чтобы не влиять на производительность устройства пользователя. Это достигается за счет минимизации обновлений и запросов URLSession. Apple использует показатели об использовании и видимости виджетов, чтобы решить, какой объем обработки разрешить вашему приложению. Обновления на основе секунд не поддерживаются.
Вам необходимо заранее создать временную шкалу со всеми видами виджета. В видеоролике Apple о WWDC они рекомендуют заранее создать график на целый день. После создания временной шкалы вы можете использовать политики.atEnd или.after для запроса новой временной шкалы. Если что-то изменится в вашем основном приложении, вы можете попросить обновить временную шкалу.