0Pricing
Swift Academy · Pelajaran

Penyedia Linimasa dan Snapshot

Sediakan konten widget dari waktu ke waktu.

Penyedia Linimasa dan Snapshot adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.

Tugas Penyedia

Widget tidak pernah memperbarui dirinya secara terus-menerus. Sebagai gantinya, TimelineProvider memberikan WidgetKit jadwal berisi entries yang telah dirender sebelumnya, lalu sistem menampilkan setiap entry pada waktu yang tepat. Penyedia menjawab tiga pertanyaan: pratinjau awal, cuplikan, dan timeline.

import WidgetKit
// TimelineProvider supplies:
//   placeholder(in:) -> instant skeleton
//   getSnapshot(in:)  -> one entry for previews
//   getTimeline(in:)  -> future entries + refresh policy

Menerapkan TimelineProvider

Penyedia menerapkan TimelineProvider dengan tipe Entry terkait. Anda menerapkan ketiga metode tersebut; masing-masing memberi Anda Context yang menjelaskan family dan apakah ini merupakan pratinjau.

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
}

Pratinjau Awal

placeholder(in:) harus mengembalikan data tiruan yang representatif seketika. Sistem menampilkannya sebagai kerangka yang disamarkan saat widget sebenarnya dimuat dan di galeri widget. Jangan pernah melakukan pekerjaan jaringan atau penyimpanan di sini.

import WidgetKit
func placeholder(in context: Context) -> WeatherEntry {
    // Synchronous, fake data, no I/O
    WeatherEntry(date: Date(),
        temperature: 0, condition: "--")
}

Cuplikan

getSnapshot menyediakan satu entry untuk situasi sementara seperti pratinjau galeri widget. Metode ini harus mengembalikan hasil dengan cepat. Saat context.isPreview bernilai true, gunakan data contoh, bukan pengambilan data yang lambat, agar galeri terasa seketika.

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 adalah bagian inti: Anda membuat larik berisi entries mendatang dan menggabungkannya dengan kebijakan penyegaran dalam sebuah Timeline. Sistem merender setiap entry pada date-nya, lalu meminta timeline baru sesuai kebijakan tersebut.

import WidgetKit
func getTimeline(
    in context: Context,
    completion: @escaping (Timeline<WeatherEntry>) -> Void) {
    let entries = buildEntries()
    let timeline = Timeline(
        entries: entries, policy: .atEnd)
    completion(timeline)
}

Kebijakan Penyegaran

Kebijakan pemuatan ulang mengatur kapan WidgetKit meminta timeline berikutnya: .atEnd setelah date entry terakhir, .after(date) pada waktu tertentu, atau .never sampai Anda memuat ulang secara manual. Sistem mengatur budget ini, jadi jangan mengharapkan pembaruan setiap detik.

import WidgetKit
// .atEnd            -> reload after final entry
// .after(someDate)  -> reload at a chosen time
// .never            -> only on manual reloadTimelines
let policy = TimelineReloadPolicy.atEnd
_ = policy

Membangun Entri Mendatang

Pola yang umum adalah menghitung sebelumnya beberapa jam berikutnya agar widget diperbarui tanpa membangunkan kode Anda setiap kali. Buat entries pada interval dari sekarang ke masa mendatang, masing-masing berisi data untuk saat tersebut.

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
}

Data Asinkron dalam timeline

Jika Anda harus mengambil data dari jaringan, lakukan sebelum memanggil penyelesaian. Bungkus pekerjaan asinkron dalam Task dan selesaikan hanya setelah data tiba. Pastikan prosesnya cepat—penyedia memiliki budget waktu yang ketat.

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")
}

Relevansi dan budget

WidgetKit membatasi seberapa sering widget disegarkan setiap hari untuk menghemat baterai. Anda tidak dapat memaksa pembaruan yang sering. Sediakan beberapa entries dalam setiap timeline dan pilih waktu pemuatan ulang yang wajar; gunakan reloadTimelines dari aplikasi hanya saat terjadi perubahan data yang berarti.

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

Penyedia untuk Widget yang Dapat Dikonfigurasi

Untuk widget dengan AppIntentConfiguration, gunakan AppIntentTimelineProvider. Metodenya menerima tindakan yang dikonfigurasi pengguna, sehingga Anda dapat mengambil data untuk opsi yang dipilih, seperti kota atau akun tertentu.

import WidgetKit
// AppIntentTimelineProvider adds the configuration:
//   func timeline(for configuration: MyIntent,
//                 in context: Context)
//       async -> Timeline<Entry>
let configurable = "intent-aware provider"
_ = configurable

Menyusun Penyedia

Penyedia yang lengkap memberikan pratinjau awal seketika, cuplikan yang cepat dan menyadari pratinjau, serta timeline berisi entries yang telah disiapkan sebelumnya dengan kebijakan pemuatan ulang yang sesuai—sehingga widget tetap terbaru dalam budget sistem.

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

Pemeriksaan Singkat

Ingat kembali batasan pada metode pratinjau awal.

Ringkasan

Anda telah mempelajari penyedia timeline:

  • placeholder mengembalikan data tiruan seketika; getSnapshot mengembalikan satu entry, menggunakan contoh saat isPreview; getTimeline mengembalikan entries mendatang beserta kebijakan.
  • Kebijakan pemuatan ulang adalah .atEnd, .after(date), atau .never; OS mengatur budget penyegaran yang sebenarnya.
  • Siapkan beberapa entries sebelumnya; lakukan pengambilan asinkron sebelum menyelesaikannya.
  • Widget yang dapat dikonfigurasi menggunakan AppIntentTimelineProvider.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penyedia Linimasa dan Snapshot” gratis?

Ya — teks lengkap “Penyedia Linimasa dan Snapshot” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Penyedia Linimasa dan Snapshot”?

Sediakan konten widget dari waktu ke waktu. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Penyedia Linimasa dan Snapshot” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Membangun WidgetKit Widget
  2. Penyedia Linimasa dan Snapshot
  3. Ikhtisar Ekstensi Aplikasi
  4. App Intents dan Shortcuts
← Kembali ke Swift Academy