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

Swift Concurrency (Task, async/await Deep Dive)

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

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

  • Swift Concurrency (Task, async/await Deep Dive) ကို ကြောက်စရာမလိုအောင် နားလည်မယ်
  • ကိုယ်တိုင် Xcode/SwiftUI code ကို run ကြည့်တတ်မယ်
  • Real project ထဲမှာ ဒီ concept ကို ချက်ချင်း အသုံးချတတ်မယ်

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

`Task { }` က asynchronous work ကို start ဖို့ 'container' ပါ — SwiftUI View ထဲမှာ `.task { }` modifier ကို (View ပေါ်လာချိန် automatic run, `.onAppear` + `Task` ပေါင်းစပ်ထားတဲ့ shortcut) သုံးလေ့ရှိပါတယ်။ `@MainActor` ကို class/function ပေါ် annotate ထားရင် 'ဒီ code ကို UI thread ပေါ်မှာသာ run ပါ' လို့ compiler ကို ပြောတာပါ — `@Published` property update (ViewModel lesson) ကို main thread ပေါ်မှာသာ လုပ်ရမှာမို့, ViewModel class ပေါ် `@MainActor` ထားလေ့ရှိပါတယ်.

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

`WeatherScreen` ထဲမှာ `.onAppear { Task { ... } }` ရေးမယ့်အစား `.task { weather = try? await fetchWeather(city: "Yangon") }` လို့ ရေးရင် ပိုရှင်းပါတယ် — `.task` modifier က View ကွယ်သွားရင် automatic cancel ပါ ပေးပါတယ် (`.onAppear` + manual `Task` ကတော့ manual cancel ရေးရပါမယ်).

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

swift
@MainActor
class WeatherViewModel: ObservableObject {
    @Published var weather: WeatherResponse?

    func loadWeather(city: String) async {
        weather = try? await fetchWeather(city: city)
    }
}

struct WeatherScreen: View {
    @StateObject private var viewModel = WeatherViewModel()

    var body: some View {
        Text(viewModel.weather?.city ?? "Loading...")
            .task {
                await viewModel.loadWeather(city: "Yangon")
            }
    }
}
You should see
Screen ဆီ ရောက်လာတာနဲ့ 'Loading...' → weather city name ဆိုပြီး automatic update ဖြစ်တာ တွေ့ရမည်။

၅ မိနစ် စမ်းကြည့်

`WeatherViewModel`/`WeatherScreen` ကို `.task { }` modifier သုံးပြီး ကိုယ်တိုင် ရေးကြည့်ပါ — screen ကနေ ချက်ချင်း navigate ထွက်ကြည့်ပြီး (`.task` ရဲ့ auto-cancel behavior ကို) observe ကြည့်ပါ။

သတိလေးတစ်ချက်

`Task { }` ထဲက error ကို catch မလုပ်ဘဲ `try?` ကို overuse ရင် (silent failure) — error ဖြစ်နေတာကို user/developer ဘယ်သူမှ မသိတော့ဘဲ debug ရခက်ခဲသွားနိုင်ပါတယ်။

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

  • `@MainActor` မထားဘဲ background thread ကနေ `@Published` property ကို directly update ခြင်း — undefined behavior/crash risk ရှိပါတယ်
  • `.onAppear` + manual `Task { }` ကို သုံးရာမှာ cancel logic ကို manual ရေးဖို့ မေ့ခြင်း — `.task { }` modifier ကို သုံးရင် ဒီ concern ကို framework ကိုယ်တိုင် ကိုင်တွယ်ပေးပါတယ်

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

`WeatherViewModel`/`WeatherScreen` ကို `.task { }` modifier သုံးပြီး ကိုယ်တိုင် ရေးကြည့်ပါ — screen ကနေ ချက်ချင်း navigate ထွက်ကြည့်ပြီး (`.task` ရဲ့ auto-cancel behavior ကို) observe ကြည့်ပါ။

You'll know it worked when: Screen ဆီ ရောက်လာတာနဲ့ 'Loading...' → weather city name ဆိုပြီး automatic update ဖြစ်တာ တွေ့ရမည်။

Swift Concurrency (Task, async/await Deep Dive) | Thuta Learning