@ObservedObject SwiftUI’da bir View’in, hiyerarşinin başka bir yerinde oluşturulan ObservableObject’teki değişiklikleri gözlemlemesini sağlayan bir property wrapper’dır. @StateObject’ten farklı olarak, @ObservedObject nesneyi oluşturmaz — yalnızca objectWillChange yayıncısına abone olur ve yayınlanan özellikler güncellendiğinde View’i yeniden çizer. Bu, @ObservedObject’i bir başlatıcı aracılığıyla ebeveynden veri alan alt View’ler için doğru seçim haline getirir. Paul Hudson’ın bir makalesine göre — Hacking with Swift (2025), tipik bir SwiftUI uygulama mimarisi şöyle kurulur: kök View, bir view model oluşturmak için @StateObject kullanır ve tüm alt View’ler onu @ObservedObject aracılığıyla alır, böylece veri tekrarı olmadan tek bir gerçek kaynağı sağlar.
Önemli Noktalar
@ObservedObject bir View’i ObservableObject değişikliklerine abone yapan bir property wrapper’dır. @ObservedObject ile işaretlenmiş bir nesne, @Published ile bildirilen özelliklerinden herhangi birini değiştirdiğinde, SwiftUI otomatik olarak View’i yeniden çizer. @ObservedObject nesneyi oluşturmaz — yalnızca mevcut bir ObservableObject örneği ile değişikliklerine tepki vermesi gereken View arasında bir bağlantı kurar.
@ObservedObject ve @StateObject arasındaki temel fark sahipliktir. @ObservedObject, nesnenin View hiyerarşisinde daha yukarıda bir yerde oluşturulduğunu ve saklandığını varsayar. Alt View, bu nesneye bir referansı başlatıcı aracılığıyla alır ve onu sadece gözlemler. Alt View yeniden oluşturulursa, ebeveynden aynı referansı alır — veriler kaybolmaz.
Apple Developer Documentation — SwiftUI (2025)’e göre, @ObservedObject iOS 13 ile birlikte kullanılabilir hale gelmiştir ve eski iOS sürümlerini destekleyen projelerde ObservableObject’i gözlemlemek için tek seçenektir. iOS 14+ sürümünde, nesne oluşturmak için @StateObject tercih edilir, ancak @ObservedObject mevcut nesneleri iletmek için geçerliliğini korur.
@ObservedObject mekanizması, Combine framework’undaki ObservableObject protokolüne dayanır. ObservableObject ile uyumlu her sınıf, herhangi bir @Published özelliği değişmeden önce bir sinyal gönderen otomatik bir objectWillChange yayıncısı alır. SwiftUI, @ObservedObject aracılığıyla bu yayıncıya abone olur ve sinyali aldığında View’i yeniden çizilmesi gereken olarak işaretler.
class TaskViewModel: ObservableObject {
@Published var tasks: [Task] = []
@Published var isLoading = false
func loadTasks() async {
isLoading = true
// veri çek
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() }
}
}
Ebeveyn View, viewModel’i başlatıcı aracılığıyla TaskListView’e aktardığında, SwiftUI nesne ile View arasında bir bağlantı oluşturur. tasks dizisi veya isLoading bayrağı değiştiğinde, SwiftUI TaskListView’i yeniden çizer. Nesnenin kendisi değişmeden kalır — @StateObject aracılığıyla ebeveyn View’de saklanır.
@ObservedObject ve @StateObject arasındaki fark, bir gözlemci ile bir sahip arasındaki farktır. @StateObject nesneyi oluşturur ve yaşam döngüsünü yönetir. @ObservedObject yalnızca başka bir yerde oluşturulmuş ve saklanmış bir nesneyi gözlemler. Aralarındaki seçim, View’in verilere karşı sorumluluğuna göre belirlenir.
| Senaryo | Öneri | Neden |
|---|---|---|
| View veri oluşturur | @StateObject | View nesneye sahiptir ve yaşam döngüsünden sorumludur |
| View veri alır | @ObservedObject | View yalnızca gözlemler, nesne ebeveynde yaşar |
| iOS 13 desteği | @ObservedObject | @StateObject kullanılamaz, manuel yönetimle @ObservedObject kullanın |
| Yeniden kullanılabilir bileşen | @ObservedObject | Bileşen veri oluşturmamalıdır — verileri dışarıdan alır |
Ana kural: View nesneyi oluşturuyorsa — @StateObject. View nesneyi alıyorsa — @ObservedObject. Bir nesne oluşturmak için @ObservedObject kullanarak bu kuralı ihlal etmek, View yeniden oluşturulduğunda veri kaybına yol açar. Bir nesneyi almak için @StateObject kullanarak ihlal etmek, ebeveynden bağımsız yinelenen bir örnek oluşturur.
@ObservedObject için tipik bir kullanım senaryosu, kök View’in bir view model oluşturduğu ve her liste hücresinin onu @ObservedObject aracılığıyla aldığı bir görev listesidir. Her hücre view model yöntemlerini çağırabilir ve değişiklikler tüm listeye otomatik olarak yansıtılır çünkü tüm hücreler aynı nesneyi gözlemler.
struct TaskRow: View {
@ObservedObject var viewModel: TaskViewModel
let task: Task
var body: some View {
HStack {
Text(task.title)
Spacer()
Button("Tamam") {
viewModel.completeTask(task)
}
}
}
}
struct TaskListContainer: View {
@StateObject var viewModel = TaskViewModel()
var body: some View {
List(viewModel.tasks) { task in
TaskRow(viewModel: viewModel, task: task)
}
}
}
Bu örnekte, TaskListContainer viewModel’i @StateObject aracılığıyla oluşturur ve her TaskRow onu @ObservedObject aracılığıyla alır. Kullanıcı herhangi bir satırda “Done” düğmesine bastığında, viewModel.completeTask yayınlanan bir özelliği değiştirir ve bu nesneyi gözlemleyen tüm View’ler otomatik olarak güncellenir.
En yaygın hata, bir View içinde nesne oluşturmak için @ObservedObject kullanmaktır. View yeniden oluşturulduğunda (örneğin durum değiştiğinde), SwiftUI yeni bir ObservableObject örneği oluşturur ve bu da birikmiş tüm verilerin kaybına yol açar. Bu hata özellikle NavigationStack’te acı vericidir; burada bir kullanıcı bir formu doldurup geri dönerken verileri kaybedebilir.
// ❌ Veri kaybı: @ObservedObject nesneyi tutmaz
struct FormView: View {
@ObservedObject var formVM = FormViewModel()
// Her View yeniden yapımında yeni formVM oluşturulur!
}
// ✅ Doğru: @StateObject nesneyi tutar
struct FormView: View {
@StateObject var formVM = FormViewModel()
// Nesne View ömrü boyunca bir kez oluşturulur
}
Bir alt View, aynı ObservableObject’i @StateObject aracılığıyla bildirirse, bağımsız bir kopya oluşturur. Ebeveyn nesnedeki değişiklikler alt öğede görünmez ve bunun tersi de geçerlidir. Nesneyi dışarıdan alan alt View’ler için her zaman @ObservedObject kullanın.
Modern SwiftUI’da @ObservedObject’e her biri kendi avantajlarına sahip birkaç alternatif vardır. Seçim, uygulama mimarisine, iOS sürümüne ve belirli kullanım durumuna bağlıdır.
@ObservedObject ve @EnvironmentObject arasındaki seçim bir stil ve mimari meselesidir. @ObservedObject, View bağımlılıklarını başlatıcı aracılığıyla açıkça gösterir ve kodu daha öngörülebilir kılar. @EnvironmentObject derin hiyerarşiler için kullanışlıdır ancak bağımlılıkları gizler, bu da hata ayıklamayı zorlaştırabilir.
Sıkça Sorulan Sorular
Evet, nesne SwiftUI dışında oluşturulup saklanıyorsa — örneğin, bir AppDelegate veya singleton’da. Bu durumda, @ObservedObject sadece mevcut bir nesnenin değişikliklerine abone olur. Ancak, SwiftUI hiyerarşisi içinde oluşturulan nesneler için, her zaman yukarıda bir yerde @StateObject gerekir.
En olası neden, özelliğin @Published aracılığıyla değil değiştirilmesi veya nesnenin kendisinin değişmemesi ancak iç yapısının objectWillChange çağırmadan değiştirilmesidir. Koleksiyonlar için yeni bir kopya ataması kullanın: array.append() yeterli değildir — dizinin kendisini array = array + [element] aracılığıyla yeniden atamanız gerekir.
@ObservedObject’in kendisi önemli bir yük oluşturmaz. Sorunlar @Published özelliklerinde sık değişiklikler olduğunda ortaya çıkar — her değişiklik, gözlemleyen tüm View’lerin yeniden çizilmesini tetikler. Optimizasyon için EquatableView kullanın, yayınlanan özelliklerin sayısını azaltın ve gereksiz güncellemelerden kaçının.
@ObservedObject tüm bir ObservableObject sınıfını gözlemler ve yayınlanan özelliklerinde herhangi bir değişiklik olduğunda View’i yeniden çizer. @Binding belirli bir değerle (String, Int, Bool) iki yönlü bir bağlantı oluşturur ve okuma ile yazmaya izin verir. @Binding daha hafiftir ve ObservableObject gerektirmez.
Evet, bu standart desendir. ObservableObject içindeki @Published, @ObservedObject ile otomatik olarak entegre olur. Her @Published özelliği, objectWillChange yayıncısına bir gözlemci ekler. Bunlardan herhangi biri değiştiğinde, bu nesne için @ObservedObject olan tüm View’ler yeniden çizilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun