@ObservedObject adalah property wrapper di SwiftUI yang memungkinkan View mengamati perubahan pada ObservableObject yang dibuat di tempat lain dalam hierarki. Berbeda dengan @StateObject, @ObservedObject tidak membuat objek — ia hanya berlangganan publisher objectWillChange-nya dan menggambar ulang View saat properti @Published diperbarui. Ini menjadikan @ObservedObject pilihan tepat untuk View anak yang menerima data dari induk melalui inisialisator. Menurut artikel Paul Hudson — Hacking with Swift (2025), arsitektur tipikal aplikasi SwiftUI dibangun sebagai berikut: View akar menggunakan @StateObject untuk membuat view model, dan semua View anak menerimanya melalui @ObservedObject, yang memastikan satu sumber kebenaran tanpa duplikasi data.
Poin Utama
@ObservedObject adalah property wrapper yang melanggankan View ke perubahan ObservableObject. Ketika objek yang ditandai dengan @ObservedObject mengubah salah satu propertinya yang dideklarasikan dengan @Published, SwiftUI secara otomatis menggambar ulang View. @ObservedObject tidak membuat objek — ia hanya membuat koneksi antara instance ObservableObject yang sudah ada dan View yang harus bereaksi terhadap perubahannya.
Perbedaan utama antara @ObservedObject dan @StateObject — adalah kepemilikan. @ObservedObject mengasumsikan bahwa objek telah dibuat dan disimpan di suatu tempat yang lebih tinggi dalam hierarki View. View anak menerima referensi ke objek ini melalui inisialisator dan hanya mengamatinya. Jika View anak dibuat ulang, ia akan menerima referensi yang sama dari induk — data tidak akan hilang.
Menurut Apple Developer Documentation — SwiftUI (2025), @ObservedObject tersedia mulai iOS 13, yang menjadikannya satu-satunya opsi untuk mengamati ObservableObject di proyek yang mendukung versi iOS lama. Di iOS 14+ @StateObject lebih disukai untuk membuat objek, tetapi @ObservedObject tetap relevan untuk meneruskan objek yang sudah ada.
Mekanisme @ObservedObject didasarkan pada protokol ObservableObject dari framework Combine. Setiap kelas yang sesuai dengan ObservableObject secara otomatis mendapatkan publisher objectWillChange yang mengirim sinyal sebelum perubahan properti @Published. SwiftUI berlangganan publisher ini melalui @ObservedObject dan setelah menerima sinyal, menandai View sebagai perlu digambar ulang.
class TaskViewModel: ObservableObject {
@Published var tasks: [Task] = []
@Published var isLoading = false
func loadTasks() async {
isLoading = true
// ambil data
isLoading = false
}
}
struct TaskListView: View {
@ObservedObject var viewModel: TaskViewModel
var body: some View {
List(viewModel.tasks) { task in
Text(task.title)
}
.task { await viewModel.loadTasks() }
}
}
Ketika View induk meneruskan viewModel ke TaskListView melalui inisialisator, SwiftUI membuat koneksi antara objek dan View. Saat array tasks atau flag isLoading berubah, SwiftUI menggambar ulang TaskListView. Objek tetap tidak berubah — ia disimpan di View induk melalui @StateObject.
Perbedaan antara @ObservedObject dan @StateObject — adalah perbedaan antara pengamat dan pemilik. @StateObject membuat objek dan mengelola siklus hidupnya. @ObservedObject hanya mengamati objek yang telah dibuat dan disimpan di tempat lain. Pilihan di antara mereka ditentukan oleh tanggung jawab View atas data.
| Skenario | Rekomendasi | Alasan |
|---|---|---|
| View membuat data | @StateObject | View memiliki objek dan bertanggung jawab atas siklus hidupnya |
| View menerima data | @ObservedObject | View hanya mengamati, objek hidup di induk |
| Dukungan iOS 13 | @ObservedObject | @StateObject tidak tersedia, gunakan @ObservedObject dengan manajemen manual |
| Komponen yang dapat digunakan kembali | @ObservedObject | Komponen tidak boleh membuat data — ia menerimanya dari luar |
Aturan utama: jika View membuat objek — @StateObject. Jika View menerima objek — @ObservedObject. Pelanggaran aturan ini ke arah @ObservedObject untuk membuat objek menyebabkan kehilangan data saat View dibangun ulang. Pelanggaran ke arah @StateObject untuk menerima objek membuat instance duplikat, independen dari induk.
Skenario tipikal penggunaan @ObservedObject — daftar tugas, di mana View akar membuat view model, dan sel daftar menerimanya melalui @ObservedObject. Setiap sel dapat memanggil metode view model, dan perubahan secara otomatis ditampilkan di seluruh daftar, karena semua sel mengamati objek yang sama.
struct TaskRow: View {
@ObservedObject var viewModel: TaskViewModel
let task: Task
var body: some View {
HStack {
Text(task.title)
Spacer()
Button("Selesai") {
viewModel.completeTask(task)
}
}
}
}
struct TaskListContainer: View {
@StateObject var viewModel = TaskViewModel()
var body: some View {
List(viewModel.tasks) { task in
TaskRow(viewModel: viewModel, task: task)
}
}
}
Dalam contoh ini TaskListContainer membuat viewModel melalui @StateObject, dan setiap TaskRow menerimanya melalui @ObservedObject. Ketika pengguna mengklik “Done” di baris mana pun, viewModel.completeTask mengubah properti published, dan semua View yang mengamati objek ini diperbarui secara otomatis.
Kesalahan paling umum — menggunakan @ObservedObject untuk membuat objek di dalam View. Ketika View dibangun ulang (misalnya, saat state berubah), SwiftUI membuat instance ObservableObject baru, yang menyebabkan hilangnya semua data yang terkumpul. Kesalahan ini sangat menyakitkan di NavigationStack, di mana pengguna dapat mengisi formulir dan kehilangan data saat kembali.
// ❌ Kehilangan data: @ObservedObject tidak menyimpan objek
struct FormView: View {
@ObservedObject var formVM = FormViewModel()
// FormVM baru dibuat setiap View dibangun ulang!
}
// ✅ Benar: @StateObject menyimpan objek
struct FormView: View {
@StateObject var formVM = FormViewModel()
// Objek dibuat sekali selama umur View
}
Jika View anak mendeklarasikan ObservableObject yang sama melalui @StateObject, ia membuat salinan independen. Perubahan pada objek induk tidak akan terlihat di anak dan sebaliknya. Selalu gunakan @ObservedObject untuk View anak yang menerima objek dari luar.
Di SwiftUI modern, ada beberapa alternatif untuk @ObservedObject, masing-masing dengan kelebihannya sendiri. Pilihan tergantung pada arsitektur aplikasi, versi iOS, dan skenario penggunaan spesifik.
Pilihan antara @ObservedObject dan @EnvironmentObject — adalah masalah gaya dan arsitektur. @ObservedObject secara eksplisit menunjukkan ketergantungan View melalui inisialisator, yang membuat kode lebih dapat diprediksi. @EnvironmentObject nyaman untuk hierarki yang dalam, tetapi menyembunyikan ketergantungan, yang dapat mempersulit debugging.
Pertanyaan yang Sering Diajukan
Ya, jika objek dibuat dan disimpan di luar SwiftUI — misalnya, di AppDelegate atau singleton. Dalam kasus ini @ObservedObject hanya berlangganan perubahan objek yang ada. Namun, untuk objek yang dibuat di dalam hierarki SwiftUI, selalu diperlukan @StateObject di suatu tempat di atas.
Penyebab paling mungkin — properti diubah tidak melalui @Published atau bukan objek itu sendiri yang berubah, melainkan struktur internalnya tanpa memanggil objectWillChange. Untuk koleksi gunakan penugasan salinan baru: array.append() tidak cukup — array harus ditugaskan ulang melalui array = array + [element].
@ObservedObject sendiri tidak menimbulkan beban signifikan. Masalah muncul saat seringnya perubahan properti @Published — setiap perubahan memicu penggambaran ulang semua View yang mengamati. Untuk optimasi gunakan EquatableView, kurangi jumlah properti published dan hindari pembaruan yang tidak perlu.
@ObservedObject mengamati seluruh kelas ObservableObject dan menggambar ulang View pada setiap perubahan properti published-nya. @Binding membuat koneksi dua arah dengan nilai spesifik (String, Int, Bool) dan memungkinkan membaca dan menulisnya. @Binding lebih ringan dan tidak memerlukan ObservableObject.
Ya, ini adalah pola standar. @Published di dalam ObservableObject secara otomatis terintegrasi dengan @ObservedObject. Setiap properti @Published menambahkan pengamat ke publisher objectWillChange. Saat salah satu dari mereka berubah, semua View dengan @ObservedObject untuk objek ini akan digambar ulang.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga