ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်
MVVM (Model-View-ViewModel) က UI (View) ကို business logic (ViewModel) ကနေ ခွဲထုတ်ထားတဲ့ architecture pattern ပါ — Model က data (database, API), View က UI (SwiftUI View), ViewModel က ၂ ခုကြားက middleman ပါ။ `ObservableObject` protocol ကို conform လုပ်ထားတဲ့ class မှာ `@Published` property ကို ထည့်ရင် — value ပြောင်းတိုင်း, ဒီ ViewModel ကို `@ObservedObject`/`@StateObject` နဲ့ observe လုပ်ထားတဲ့ View အားလုံးကို automatic re-render ပေးပါတယ် (`@State` ရဲ့ View-local scope ထက် ပိုကျယ်ပြန့်ပါတယ်).
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
`class TodoViewModel: ObservableObject { @Published var todos: [TodoItem] = []; func addTodo(title: String) { todos.append(TodoItem(title: title)) } }` လို့ ရေးထားရင် — View ထဲမှာ `@StateObject private var viewModel = TodoViewModel()` နဲ့ instance ကို ရယူပြီး, `viewModel.todos` ကို `List` ထဲမှာ display လုပ်နိုင်ပါတယ် — button tap ရင် `viewModel.addTodo(...)` ခေါ်ရုံပါပဲ, UI code ထဲမှာ business logic ရောစပ်စရာ မလိုတော့ပါ.
အတူတူ ကြည့်မယ်
class TodoViewModel: ObservableObject {
@Published var todos: [TodoItem] = []
func addTodo(title: String) {
todos.append(TodoItem(title: title))
}
}
struct TodoScreen: View {
@StateObject private var viewModel = TodoViewModel()
var body: some View {
List(viewModel.todos) { todo in
Text(todo.title)
}
}
}`viewModel.addTodo(title: "Buy milk")` ခေါ်ရင် List ထဲမှာ item အသစ် automatic ပေါ်လာတာ တွေ့ရမည်။၅ မိနစ် စမ်းကြည့်
`TodoViewModel` ကို ကိုယ်တိုင်ရေးပြီး, todo item ၂-၃ ခု `addTodo()` နဲ့ ထည့်ကြည့်ပါ — `TodoScreen` ကို run ပြီး List ထဲမှာ automatic ပေါ်လာကြောင်း confirm လုပ်ကြည့်ပါ။
သတိလေးတစ်ချက်
`@Published` property ကို UI thread မဟုတ်တဲ့ background thread ကနေ update လုပ်ရင် crash/undefined behavior ဖြစ်နိုင်ပါတယ် — `@MainActor` ကို ViewModel class ပေါ် annotate ထားရန် (ဒါမှမဟုတ် `DispatchQueue.main.async` ကို သုံးရန်) လိုအပ်ပါတယ်။