Merhabalar, Bu yazımda SwiftUI ile birlikte kullandığımız ve hangisini kullanmalıyım diye düşündüğümüz değişken yapılarından @StateObject ve @ObservedObject kıyaslaması yapacağım.
Örneğin bir view nesnemize MVVM tasarım desenine uygun şekilde bir view model yazdığımız zaman ilgili view model objesi bu iki değişkenden biri olabilmektedir. Ancak burada farklar oluşmakta.
Aşağıda basit bir örnek sizlerle paylaşayım.
struct ContentView: View {
@StateObject var VM = ContentViewViewModel()
var body: some View {
VStack(spacing: 14) {
Text("Counter: \(VM.counter)")
Button {
VM.increaseCounter()
} label: {
Text("Tap Tap")
}
}
}
}
class ContentViewViewModel: ObservableObject {
@Published var counter: Int = 0
func increaseCounter() {
counter += 1
}
}
Yukarda basit bir şekilde bir view model yapısı kurduk ve bir değişkeni artırarak ilgili text nesnemizde güncel halini ekranda gösterdik.
struct ItemListView: View {
@State private var items = ["Hello World!"]
var body: some View {
VStack {
Button("Append item") {
items.append("<3")
}
List(items, id: \.self) { name in
Text(name)
}
ContentView()
}
}
}
Eğer ContentView nesnemizdeki VM değişkenimiz @ObservedObject olsaydı bu örnekteki gibi bir view içerisinde kullandığımız zaman ilgili item append olduğu zaman ekran redraw olacağı için ContentView nesneside değişken değeri sıfırlanacaktı. Yani bu iki değişken yapısının en büyük farklarından biri @StateObject hafızada tutar. @ObservedObject hafızadan boşaltır. Aslında bunları strong ve unowned değişkenlerede benzetebiliriz.
Kullanım olarak tavsiye edilen @ObservedObject objesi referans olarak kullanılmalı bir view içerisinde create object olarak yaratılmamalıdır. Aksi halde SwiftUI bu nesneyi hafızadan silebilir ve uygulamalarınızda crash veya istenmeyen sorunlara yol açabilir.
struct OrderListView: View {
@StateObject var orderVM = ContentViewViewModel()
var body: some View {
VStack {
OrderDetailView(orderDetail: orderVM)
}
}
}
struct OrderDetailView: View {
@ObservedObject var orderDetail: ContentViewViewModel
var body: some View {
Text("Order Detail..")
}
}
Yukardaki örnekteki gibi bir kullanım en doğrusu olacaktır.
İlk Yorumu Siz Yapın