@ObservedObject: nedir, nesneleri izleme ve View’leri güncelleme

Yazar: IT Sectr Yayınlanma: 2026-06-26 Okuma süresi: 9 dk

@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 ebeveyn View’de oluşturulan ObservableObject’i gözlemlemek için bir property wrapper.
  • Nesneye sahip değildir — @StateObject’in aksine, @ObservedObject nesnenin yaşam döngüsünü yönetmez.
  • Değişikliklere abone olur — @Published özellikleri değiştiğinde, View otomatik olarak yeniden çizilir.
  • Başlatıcı aracılığıyla iletilir — nesne, bir başlatıcı parametresi aracılığıyla alt View’e iletilir.
  • iOS 13+ — @ObservedObject, @StateObject’in aksine (iOS 14+), SwiftUI’nin ilk sürümünden itibaren kullanılabilir.

SwiftUI’da @ObservedObject Nedir

@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 Nasıl Çalışır

@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.

swift
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 vs @StateObject: Ne Zaman Hangisini Kullanmalı

@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ÖneriNeden
View veri oluşturur@StateObjectView nesneye sahiptir ve yaşam döngüsünden sorumludur
View veri alır@ObservedObjectView 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@ObservedObjectBileş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 Kullanım Örnekleri

@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.

swift
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.

@ObservedObject ile Sık Yapılan Hatalar

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.

Hata: @StateObject yerine @ObservedObject

swift
// ❌ 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
}

Hata: @ObservedObject gerekliyken @StateObject iletmek

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.

SwiftUI’da @ObservedObject Alternatifleri

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.

  • @EnvironmentObject — bir nesneyi başlatıcı aracılığıyla açıkça iletmeden SwiftUI ortamından almayı sağlar. Birçok ekran tarafından ihtiyaç duyulan nesneler için kullanışlıdır, ancak .environmentObject() aracılığıyla açık enjeksiyon gerektirir.
  • @State + @Binding — basit değer türleri için ObservableObject gerekmez. Depolama için @State ve alt View’lere iletmek için @Binding kullanın.
  • @AppStorage — View ile otomatik olarak senkronize edilmesi gereken UserDefaults değerleri için.
  • @SceneStorage — sahne yeniden başlatmaları arasında geçici durumu korumak için (örneğin, bir listedeki kaydırma konumu).

@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

@ObservedObject, ebeveynde @StateObject olmadan kullanılabilir mi?

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.

@ObservedObject bazen neden View’i güncellemez?

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 performansı etkiler mi?

@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’in @Binding’den farkı nedir?

@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.

@ObservedObject ve @Published aynı sınıfta birleştirilebilir mi?

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

  • @ObservedObject — hiyerarşinin başka bir yerinde oluşturulan ObservableObject’i gözlemlemek için bir property wrapper.
  • Nesneye sahip değildir — @StateObject’in aksine, @ObservedObject yaşam döngüsünü yönetmez ve nesneyi oluşturmaz.
  • Combine ile abonelik — SwiftUI otomatik olarak ObservableObject’in objectWillChange yayıncısına abone olur.
  • iOS 13+ — @ObservedObject, SwiftUI’nin ilk sürümünden itibaren kullanılabilir, eski destekli projeler için önemlidir.
  • Başlatıcı aracılığıyla iletilir — nesne açıkça alt View’e iletilir, bağımlılıkları şeffaf hale getirir.
  • Sahipik hatası — bir nesne oluşturmak için @ObservedObject kullanmak, View yeniden oluşturulduğunda veri kaybına yol açar.
  • Alternatifler — ortam enjeksiyonu için @EnvironmentObject, değer türleri için @State/@Binding.

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.

Projeyi tartış

Ayrıca okuyun