Dostawcy osi czasu i migawki
Dostarczaj zawartość widżetu w czasie.
Dostawcy osi czasu i migawki to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Zadanie providera
Widżet nigdy nie aktualizuje się sam w sposób ciągły. Zamiast tego TimelineProvider przekazuje WidgetKit harmonogram wstępnie wyrenderowanych wpisów, a system wyświetla każdy z nich we właściwym czasie. Provider odpowiada na trzy pytania: placeholder, snapshot i timeline.
import WidgetKit
// TimelineProvider supplies:
// placeholder(in:) -> instant skeleton
// getSnapshot(in:) -> one entry for previews
// getTimeline(in:) -> future entries + refresh policyZgodność z TimelineProvider
Provider jest zgodny z protokołem TimelineProvider i ma powiązany typ Entry. Należy zaimplementować trzy metody; każda z nich przekazuje obiekt Context opisujący rodzinę oraz informujący, czy jest to podgląd.
import WidgetKit
struct WeatherProvider: TimelineProvider {
typealias Entry = WeatherEntry
func placeholder(in context: Context) -> WeatherEntry {
WeatherEntry(date: Date(),
temperature: 20, condition: "Sunny")
}
// getSnapshot and getTimeline follow
}Placeholder
placeholder(in:) musi zwracać natychmiast reprezentatywne dane przykładowe. System wyświetla je jako zamaskowany szkielet podczas ładowania właściwego widżetu oraz w galerii widżetów. W tej metodzie nigdy nie należy wykonywać operacji sieciowych ani dyskowych.
import WidgetKit
func placeholder(in context: Context) -> WeatherEntry {
// Synchronous, fake data, no I/O
WeatherEntry(date: Date(),
temperature: 0, condition: "--")
}Snapshot
getSnapshot dostarcza pojedynczy wpis w przejściowych sytuacjach, takich jak podgląd w galerii widżetów. Powinien zwracać wynik szybko. Gdy context.isPreview ma wartość true, należy użyć danych przykładowych zamiast wykonywać powolne pobieranie, aby galeria wyświetlała się natychmiast.
import WidgetKit
func getSnapshot(
in context: Context,
completion: @escaping (WeatherEntry) -> Void) {
if context.isPreview {
completion(WeatherEntry(date: Date(),
temperature: 22, condition: "Clear"))
} else {
completion(currentEntry())
}
}Oś czasu
getTimeline to najważniejsza metoda: tworzy się w niej tablicę przyszłych wpisów i łączy ją z zasadą odświeżania w obiekcie Timeline. System renderuje każdy wpis w określonym dla niego dniu, a następnie zgodnie z zasadą prosi o nową oś czasu.
import WidgetKit
func getTimeline(
in context: Context,
completion: @escaping (Timeline<WeatherEntry>) -> Void) {
let entries = buildEntries()
let timeline = Timeline(
entries: entries, policy: .atEnd)
completion(timeline)
}Zasady odświeżania
Zasada ponownego ładowania określa, kiedy WidgetKit poprosi o następną oś czasu: .atEnd po dacie ostatniego wpisu, .after(date) o określonej porze lub .never do czasu ręcznego ponownego załadowania. System ogranicza częstotliwość tych operacji, dlatego nie należy oczekiwać aktualizacji co sekundę.
import WidgetKit
// .atEnd -> reload after final entry
// .after(someDate) -> reload at a chosen time
// .never -> only on manual reloadTimelines
let policy = TimelineReloadPolicy.atEnd
_ = policyTworzenie przyszłych wpisów
Popularnym rozwiązaniem jest wcześniejsze obliczenie danych na kilka najbliższych godzin, aby widżet aktualizował się bez każdorazowego uruchamiania Państwa kodu. Należy generować wpisy w odstępach od chwili obecnej do przyszłości, a każdy z nich powinien zawierać dane właściwe dla danego momentu.
import WidgetKit
import Foundation
func hourlyEntries() -> [WeatherEntry] {
var entries: [WeatherEntry] = []
let now = Date()
for hour in 0..<6 {
let date = Calendar.current.date(
byAdding: .hour, value: hour, to: now)!
entries.append(WeatherEntry(date: date,
temperature: 18 + hour, condition: "Sunny"))
}
return entries
}Asynchroniczne dane na osi czasu
Jeśli trzeba pobrać dane z sieci, należy zrobić to przed wywołaniem completion. Pracę asynchroniczną należy opakować w Task i wywołać completion dopiero po otrzymaniu danych. Trzeba działać szybko — providery mają bardzo ograniczony limit czasu.
import WidgetKit
func getTimeline(
in context: Context,
completion: @escaping (Timeline<WeatherEntry>) -> Void) {
Task {
let entry = await fetchForecast()
let timeline = Timeline(
entries: [entry], policy: .after(
Date().addingTimeInterval(3600)))
completion(timeline)
}
}
func fetchForecast() async -> WeatherEntry {
WeatherEntry(date: Date(),
temperature: 21, condition: "Cloudy")
}Istotność i limit
WidgetKit ogranicza liczbę odświeżeń w ciągu dnia, aby oszczędzać baterię. Nie można wymusić częstych aktualizacji. Należy dostarczać kilka wpisów w każdej osi czasu i wybierać rozsądny czas ponownego ładowania; z aplikacji należy używać reloadTimelines tylko w reakcji na istotne zmiany danych.
import WidgetKit
// The system, not you, decides exact refresh timing.
// Strategy: pre-bake multiple entries + a sensible policy
// + app-driven reloads on real changes.
let budget = "refreshes are budgeted by the OS"
_ = budgetProvider widżetów konfigurowalnych
W przypadku widżetu korzystającego z AppIntentConfiguration należy zamiast niego użyć AppIntentTimelineProvider. Jego metody otrzymują intencję skonfigurowaną przez użytkownika, dzięki czemu można pobrać dane dla wybranej opcji (wybranego miasta, konta itp.).
import WidgetKit
// AppIntentTimelineProvider adds the configuration:
// func timeline(for configuration: MyIntent,
// in context: Context)
// async -> Timeline<Entry>
let configurable = "intent-aware provider"
_ = configurableSkładanie providera
Kompletny provider zapewnia natychmiastowy placeholder, szybki snapshot uwzględniający podgląd oraz oś czasu z wcześniej przygotowanymi wpisami i odpowiednią zasadą ponownego ładowania — dzięki temu widżet pozostaje aktualny w ramach limitu narzuconego przez system.
import WidgetKit
// 1. placeholder -> instant dummy
// 2. getSnapshot -> sample when isPreview, else current
// 3. getTimeline -> [entries] + .atEnd or .after
let summary = "three methods, one current widget"
_ = summarySzybkie sprawdzenie
Proszę przypomnieć sobie ograniczenie dotyczące metody placeholder.
Podsumowanie
Poznali Państwo providery osi czasu:
placeholderzwraca natychmiast dane przykładowe;getSnapshotzwraca jeden wpis (dane przykładowe, gdyisPreviewma wartość true);getTimelinezwraca przyszłe wpisy oraz zasadę odświeżania.- Zasady ponownego ładowania to
.atEnd,.after(date)lub.never; system operacyjny ogranicza rzeczywistą częstotliwość odświeżeń. - Należy wcześniej przygotowywać wiele wpisów, a pobieranie asynchroniczne wykonywać przed zakończeniem operacji.
- Widżety konfigurowalne korzystają z
AppIntentTimelineProvider.
Ucz się Swift dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 122
- Lekcje
- 409
Często zadawane pytania
Czy lekcja „Dostawcy osi czasu i migawki” jest bezpłatna?
Tak — pełny tekst „Dostawcy osi czasu i migawki” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Dostawcy osi czasu i migawki”?
Dostarczaj zawartość widżetu w czasie. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Dostawcy osi czasu i migawki”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Tworzenie widżetu WidgetKit
- Dostawcy osi czasu i migawki
- Przegląd rozszerzeń aplikacji
- App Intents i skróty