Swift Academy · Oppitunti

Aikajanan tarjoajat ja tilannevedokset

Tarjotkaa widgetin sisältöä ajan mittaan.

Oppitunti 2/413 vaihetta

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 policy

TimelineProvider-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
_ = policy

Tulevien 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"
_ = budget

Muokattavien 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"
_ = configurable

Providerin 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"
_ = summary

Pikatarkistus

Palauttakaa mieleenne placeholder-metodia koskeva rajoitus.

Kertaus

Opitte, miten aikajanan providerit toimivat:

  • placeholder palauttaa välittömät esimerkkitiedot, getSnapshot palauttaa yhden merkinnän (esikatselussa esimerkkitiedot, kun isPreview on käytössä), ja getTimeline palauttaa 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.
Aloita maksutta

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

  1. WidgetKit-widgetin rakentaminen
  2. Aikajanan tarjoajat ja tilannevedokset
  3. App Extensions -laajennusten yleiskatsaus
  4. App Intents ja Shortcuts
← Takaisin: Swift Academy