ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်
Network-based app တစ်ခုမှာ loading state (data fetch နေဆဲ), success state (data ရပြီး), error state (network fail) — state သုံးမျိုးကို UI မှာ handle လုပ်ပေးရပါတယ် — user ကို 'ဘာဖြစ်နေလဲ' အမြဲ သိစေရမှာပါ (blank screen တစ်ခုတည်း ချန်ထားလို့ မရပါ)။ `enum WeatherUiState { case loading; case success(WeatherResponse); case error(String) }` ဆိုတဲ့ pattern ကို state management အတွက် သုံးလေ့ရှိပါတယ် (Android ရဲ့ sealed class pattern နဲ့ ဆင်တူပါတယ်).
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
City name TextField ထဲ ရိုက်ပြီး Search button ကို tap ရင် — ViewModel က `state = .loading` လို့ ပြောင်းပြီး, `fetchWeather(city:)` ကို `Task { }` ထဲ ခေါ်ပါတယ် — success ဖြစ်ရင် `state = .success(response)`, fail ဖြစ်ရင် (network down, city not found) `state = .error("...")` ဆိုပြီး state ပြောင်းပါတယ်, View ကတော့ `switch state { case .loading: ProgressView(); case .success(let data): WeatherCard(data); case .error(let msg): Text(msg) }` ဆိုပြီး state အလိုက် ကွဲပြားစွာ render လုပ်ပါတယ်.
အတူတူ ကြည့်မယ်
enum WeatherUiState {
case loading
case success(WeatherResponse)
case error(String)
}
@MainActor
class WeatherViewModel: ObservableObject {
@Published var state: WeatherUiState = .loading
func search(city: String) async {
state = .loading
do {
let weather = try await fetchWeather(city: city)
state = .success(weather)
} catch {
state = .error("Could not load weather for \(city)")
}
}
}City name ရိုက်ထည့်ပြီး search ရင် loading spinner → weather data (ဒါမှမဟုတ် error message) ကို screen ပေါ်မှာ တွေ့ရမည်။၅ မိနစ် စမ်းကြည့်
Weather app (search TextField + Loading/Success/Error UI) ကို ကိုယ်တိုင် ဆောက်ကြည့်ပါ — city name မှားရိုက်ပြီး error state ကို ထွက်စေအောင် စမ်းကြည့်ပါ။
သတိလေးတစ်ချက်
API rate limit (free tier weather API တွေက request/day ကန့်သတ်ချက် ရှိလေ့ရှိပါတယ်) ကို သတိထားပါ — testing လုပ်ရင်း request ထပ်ခါထပ်ခါ ပို့ပြီး limit ကျော်သွားနိုင်ပါတယ်။