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 policyMenerapkan 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
_ = policyMembangun 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"
_ = budgetPenyedia 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"
_ = configurableMenyusun 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"
_ = summaryPemeriksaan Singkat
Ingat kembali batasan pada metode pratinjau awal.
Ringkasan
Anda telah mempelajari penyedia timeline:
placeholdermengembalikan data tiruan seketika;getSnapshotmengembalikan satu entry, menggunakan contoh saatisPreview;getTimelinemengembalikan 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
- Membangun WidgetKit Widget
- Penyedia Linimasa dan Snapshot
- Ikhtisar Ekstensi Aplikasi
- App Intents dan Shortcuts