Section 3/141 menit
3. Teori: Cara Kerja Timeline dan Widget Rendering
3. Teori: Cara Kerja Timeline dan Widget Rendering
Model Rendering Berbasis Snapshot
Widget tidak berjalan terus-menerus. Sistem bekerja seperti ini:
swift
App Anda (WidgetExtension target)
↓
getTimeline() dipanggil oleh sistem
↓
Anda mengembalikan array TimelineEntry
(misal: 24 entry, satu per jam)
↓
WidgetKit merender SwiftUI view untuk SETIAP entry
dan menyimpannya sebagai snapshot/image
↓
Sistem menampilkan snapshot yang tepat sesuai waktu
(tanpa menjalankan kode Anda lagi)
↓
Pada waktu yang ditentukan policy, getTimeline() dipanggil lagi
Implikasi penting: view Anda dirender di luar proses app utama, di proses WidgetKit milik sistem. Ini berarti:
- Tidak bisa akses
UserDefaults.standard— harus gunakan App Group - Tidak bisa shared state dengan app — gunakan
@AppStoragedengan suite, atau file bersama - Network request harus selesai sebelum
completion()dipanggil dalamgetTimeline
Timeline Policy
swift
Timeline Policy mengontrol kapan WidgetKit akan request timeline baru:
.atEnd → Minta timeline baru setelah entry terakhir berlalu
Cocok untuk: konten yang refresh berkala (cuaca, berita)
.after(date) → Minta timeline baru pada tanggal tertentu di masa depan
Cocok untuk: jadwal yang diketahui (countdown event)
.never → Jangan refresh otomatis — app harus panggil WidgetCenter.shared.reloadTimelines()
Cocok untuk: data yang hanya berubah saat user interact dengan app
Batasan Widget
- Runtime:
getTimeline()harus mengembalikan data dalam waktu terbatas (sistem kill jika terlalu lama) - Memory: Sangat terbatas — hindari gambar besar atau operasi berat
- Network: Bisa melakukan network request di
getTimeline(), tapi harus async dengangetTimeline(in:completion:)biasa atau menggunakanTimelineProvideryang mendukung async - Refresh rate: Apple membatasi seberapa sering widget bisa refresh untuk menjaga battery. Jangan asumsi refresh bisa terjadi setiap menit.