Aikajanan tarjoajat ja tilannevedokset
Tarjotkaa widgetin sisältöä ajan mittaan.
Aikajanan tarjoajat ja tilannevedokset on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.
Providerin tehtävä
Widget ei koskaan päivity jatkuvasti itsestään. Sen sijaan TimelineProvider antaa WidgetKitille ennalta renderöityjen merkintöjen aikataulun, ja järjestelmä näyttää kunkin oikeaan aikaan. Provider vastaa kolmeen kysymykseen: placeholder, snapshot ja timeline.
import WidgetKit
// TimelineProvider supplies:
// placeholder(in:) -> instant skeleton
// getSnapshot(in:) -> one entry for previews
// getTimeline(in:) -> future entries + refresh policyTimelineProvider-protokollan noudattaminen
Provider noudattaa TimelineProvider-protokollaa, jolla on siihen liittyvä Entry-tyyppi. Toteutatte kolme metodia, joista jokainen saa Context-arvon, joka kuvaa widget-perhettä ja kertoo, onko kyseessä esikatselu.
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:)-menetelmän on palautettava edustavilla esimerkkitiedoilla täytetty tulos välittömästi. Järjestelmä näyttää sen peitettynä luurankona, kun oikea widget latautuu, sekä widget-galleriassa. Älkää koskaan tehkö tässä verkko- tai levyoperaatioita.
import WidgetKit
func placeholder(in context: Context) -> WeatherEntry {
// Synchronous, fake data, no I/O
WeatherEntry(date: Date(),
temperature: 0, condition: "--")
}Snapshot
getSnapshot tarjoaa yhden merkinnän tilapäisiä tilanteita, kuten widget-gallerian esikatselua, varten. Sen pitäisi palautua nopeasti. Kun context.isPreview on true, käyttäkää hidasta hakua välttävää esimerkkidataa, jotta galleria tuntuu välittömältä.
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())
}
}Timeline
getTimeline on kokonaisuuden ydin: luotte tulevien merkintöjen taulukon ja yhdistätte sen päivityskäytäntöön Timeline-arvoksi. Järjestelmä renderöi kunkin merkinnän sen ajankohtana ja pyytää sitten uutta aikajanaa käytännön mukaisesti.
import WidgetKit
func getTimeline(
in context: Context,
completion: @escaping (Timeline<WeatherEntry>) -> Void) {
let entries = buildEntries()
let timeline = Timeline(
entries: entries, policy: .atEnd)
completion(timeline)
}Päivityskäytännöt
Uudelleenlatauskäytäntö määrittää, milloin WidgetKit pyytää seuraavaa aikajanaa: .atEnd viimeisen merkinnän ajankohdan jälkeen, .after(date) tiettynä ajankohtana tai .never, kunnes päivität widgetin manuaalisesti. Järjestelmä rajoittaa näitä päivityksiä, joten älkää odottako päivityksiä sekunnin välein.
import WidgetKit
// .atEnd -> reload after final entry
// .after(someDate) -> reload at a chosen time
// .never -> only on manual reloadTimelines
let policy = TimelineReloadPolicy.atEnd
_ = policyTulevien merkintöjen luominen
Yleinen toimintatapa on laskea etukäteen seuraavien tuntien merkinnät, jotta widget päivittyy herättämättä koodianne joka kerta. Luokaa merkintöjä määräajoin nykyhetkestä tulevaisuuteen niin, että jokainen sisältää kyseisen ajan tiedot.
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
}Asynkroniset tiedot aikajanalla
Jos tiedot on haettava verkosta, tehkää se ennen completion-kutsua. Käärikää asynkroninen työ Task-tehtävään ja kutsukaa completionia vasta, kun tiedot ovat saapuneet. Pitäkää toiminta nopeana — providereilla on tiukka aikabudjetti.
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")
}Merkityksellisyys ja aikabudjetti
WidgetKit rajoittaa päivittäisten päivitysten määrää akun säästämiseksi. Ette voi pakottaa widgetiä päivittymään usein. Tarjotkaa useita merkintöjä aikajanaa kohden ja valitkaa kohtuullinen päivitysaika. Käyttäkää reloadTimelines-menetelmää sovelluksesta vain silloin, kun merkitykselliset tiedot muuttuvat.
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"
_ = budgetMuokattavien widgetien provider
Käyttäkää AppIntentConfiguration-widgetissä sen sijaan AppIntentTimelineProvider -provideria. Sen metodit saavat käyttäjän määrittämän intentin, joten voitte hakea tiedot valitun vaihtoehdon, kuten kaupungin tai tilin, perusteella.
import WidgetKit
// AppIntentTimelineProvider adds the configuration:
// func timeline(for configuration: MyIntent,
// in context: Context)
// async -> Timeline<Entry>
let configurable = "intent-aware provider"
_ = configurableProviderin kokoaminen
Valmis provider tarjoaa välittömän placeholderin, nopeasti palautuvan esikatselutietoisen snapshotin ja valmiiksi luotujen merkintöjen aikajanan sopivalla päivityskäytännöllä — näin widget pysyy ajan tasalla järjestelmän sallimissa rajoissa.
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"
_ = summaryPikatarkistus
Palauttakaa mieleenne placeholder-metodia koskeva rajoitus.
Kertaus
Opitte, miten aikajanan providerit toimivat:
placeholderpalauttaa välittömät esimerkkitiedot,getSnapshotpalauttaa yhden merkinnän (esikatselussa esimerkkitiedot, kunisPreviewon käytössä), jagetTimelinepalauttaa tulevat merkinnät sekä käytännön.- Päivityskäytännöt ovat
.atEnd,.after(date)tai.never; käyttöjärjestelmä rajoittaa todellisten päivitysten määrää. - Luokaa useita merkintöjä valmiiksi ja tehkää asynkroniset haut ennen completion-kutsua.
- Muokattavat widgetit käyttävät
AppIntentTimelineProvider-provideria.
Opi Swift tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 122
- Oppitunnit
- 409
Usein kysytyt kysymykset
Onko oppitunti ”Aikajanan tarjoajat ja tilannevedokset” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Aikajanan tarjoajat ja tilannevedokset”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Aikajanan tarjoajat ja tilannevedokset”?
Tarjotkaa widgetin sisältöä ajan mittaan. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Aikajanan tarjoajat ja tilannevedokset”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?
Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- WidgetKit-widgetin rakentaminen
- Aikajanan tarjoajat ja tilannevedokset
- App Extensions -laajennusten yleiskatsaus
- App Intents ja Shortcuts