Thuta Learning
ရှာဖွေရန်
ProjectsMobile Developmentintermediate

Project — Weather App (URLSession + async/await)

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Project — Weather App (URLSession + async/await) ကို ကြောက်စရာမလိုအောင် နားလည်မယ်
  • ကိုယ်တိုင် Xcode/SwiftUI code ကို run ကြည့်တတ်မယ်
  • Real project ထဲမှာ ဒီ concept ကို ချက်ချင်း အသုံးချတတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

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 လုပ်ပါတယ်.

အတူတူ ကြည့်မယ်

swift
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)")
        }
    }
}
You should see
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 ကျော်သွားနိုင်ပါတယ်။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • Error state ကို generic 'Something went wrong' message တစ်ခုတည်းနဲ့ ချန်ထားခြင်း — network error/city not found error ကို ခွဲခြားပြပေးရင် user ပိုနားလည်ပါတယ်
  • Loading state ကို Simulator ရဲ့ fast network ပေါ်မှာသာ test လုပ်ခြင်း — Xcode ရဲ့ Network Link Conditioner ကို သုံးပြီး slow/no network scenario ကိုလည်း test လုပ်သင့်ပါတယ်

အခု ကိုယ်တိုင် စမ်းကြည့်

Weather app (search TextField + Loading/Success/Error UI) ကို ကိုယ်တိုင် ဆောက်ကြည့်ပါ — city name မှားရိုက်ပြီး error state ကို ထွက်စေအောင် စမ်းကြည့်ပါ။

You'll know it worked when: City name ရိုက်ထည့်ပြီး search ရင် loading spinner → weather data (ဒါမှမဟုတ် error message) ကို screen ပေါ်မှာ တွေ့ရမည်။

Project — Weather App (URLSession + async/await) | Thuta Learning