Ang Async/Await — ay isang pares ng mga keyword para sa pagsulat ng asynchronous code sa synchronous na estilo, na available sa Swift mula noong iOS 13 at sa Kotlin gamit ang coroutines. Ayon sa Apple Swift Documentation, 2026, ang Async/Await ay pumapalit sa mga chain ng callback at GCD, ginagawang linear at nababasa ang asynchronous code. Ang keyword na async ay nagmamarka ng isang function bilang asynchronous, at ang await ay nagpapatigil sa pagpapatupad nito hanggang sa makuha ang resulta.
Mga Pangunahing Punto
Async/Await — ay isang language construct na nagpapahintulot sa pagsulat ng asynchronous code nang kasing-lin dalis ng synchronous code. Sa Swift, ito ay lumitaw sa iOS 13 / macOS 10.15 kasama ng Swift Concurrency framework. Sa Kotlin, ang async/await ay available sa pamamagitan ng coroutines library (kotlinx.coroutines) mula noong bersyon 1.3.
Bago ang pagdating ng async/await, ang asynchronous code ay binuo sa callbacks, GCD o RxSwift. Ang mga chain ng nested callbacks ay humantong sa callback hell — malalim na nesting na nagpapahirap sa pagbabasa at debugging. Nalulutas ng Async/Await ang problemang ito sa pamamagitan ng pagpapahintulot sa mga asynchronous function na “magpatigil” sa mga punto ng await at magpatuloy pagkatapos makuha ang resulta.
Ayon sa datos ng Google (2025), ang paggamit ng async/await sa Kotlin ay nagbabawas ng bilang ng mga linya ng asynchronous code ng 40–60% kumpara sa callback approach. Sa Swift, ang adoption ng Swift Concurrency ay umabot ng 68% sa mga nai-publish na application noong 2025. iOS 16 ay nagdagdag ng suporta para sa Swift Concurrency sa UIKit, SwiftUI at Foundation, na ginawang standard na tool ang async/await para sa lahat ng bagong Apple projects.
Ang pangunahing pagkakaiba ng async/await sa mga thread — pagpapatigil nang walang pag-block. Kapag ang isang function ay nakatagpo ng await, ito ay napapatigil, pinalalaya ang kasalukuyang thread para sa iba pang mga task. Pagkatapos makumpleto ang asynchronous na operasyon, ang function ay magpapatuloy sa pareho o ibang thread. Ito ay tinatawag na cooperative multitasking.
Ang async function ay kino-compile sa state machine — isang finite state machine na namamahala sa mga estado ng pagpapatupad. Sa punto ng await, ini-save ng compiler ang konteksto (mga local variable, return address) at inililipat ang kontrol sa runtime. Kapag handa na ang resulta, ibinabalik ng runtime ang konteksto at ipinagpapatuloy ang pagpapatupad.
Sa Swift, ang state machine na ito ay ipinatupad sa antas ng compiler na SIL (Swift Intermediate Language). Sa Kotlin — sa pamamagitan ng Continuation Passing Style (CPS) mechanism: bawat suspend function ay tumatanggap ng isang nakatagong parameter na Continuation, kung saan ibinabalik ang resulta. Ang parehong approach ay ginagarantiyahan ang ligtas na pagpapatuloy nang walang memory leaks.
Ang callback approach ay nangangailangan ng pagpasa ng closure na tinatawag pagkatapos makumpleto ang operasyon. Sa tatlong sunod-sunod na request, nagreresulta ito sa tatlong antas ng nesting na may error handling sa bawat isa. Async/Await ay ginagawang tatlong sunod-sunod na linya ang parehong tatlong request na may iisang catch block.
GCD (DispatchQueue) ay nilulutas ang problema ng callback hell sa pamamagitan ng serial queues at DispatchGroup, ngunit nananatiling verbose. Para sa isang simpleng gawain — i-load ang user, pagkatapos friends, pagkatapos UI — kinakailangan ang paggawa ng queues, groups at notify blocks. Async/Await ay ginagawa ang parehong gawain sa tatlong linya sa isang function.
| Aspekto | Callback | GCD | Async/Await |
|---|---|---|---|
| Nesting | Malalim (pyramid of doom) | Katamtaman (groups+notify) | Linear (flat) |
| Error handling | Per-callback | Manual | Nag-iisa (try/catch) |
| Pagkansela | Manual | Limitado | Task.cancel() |
| Thread safety | Manual | Sa pamamagitan ng serial queue | Sa pamamagitan ng MainActor |
Ayon sa datos ng Apple WWDC 2024, ang Swift Concurrency async/await ay ang inirerekomendang approach para sa bagong code. Ang GCD ay nananatili para sa integration sa C-libraries at specific low-level scenarios ng thread processing.
Task — ay ang pangunahing unit ng asynchronous work sa Swift. Ang Task ay nilikha sa konteksto ng isang umiiral na actor o sa anumang thread. Sa loob ng Task, maaaring tawagin ang async functions sa pamamagitan ng await. TaskGroup ay nagpapahintulot sa pagpapatakbo ng maraming child task nang magkapareho at pagkolekta ng kanilang mga resulta — katulad ng DispatchGroup ngunit mas malakas.
Actor — ay isang thread-safe reference type na nagproprotekta sa estado nito mula sa data races. Ginagarantiyahan ng compiler na ang access sa properties ng actor ay posible lamang sa pamamagitan ng async calls o sa loob ng actor isolation. Actor ay pumapalit sa serial DispatchQueue para sa proteksyon ng shared mutable state nang walang manual locks.
Ang prinsipyo ng Structured Concurrency ay nagsasabi: bawat asynchronous task ay may magulang, at ang magulang ay hindi makukumpleto hangga't hindi nakumpleto ang lahat ng anak nito. Kung ang task A ay naglunsad ng Task { await B() }, ang A ay naghihintay sa B. Ito ay pumipigil sa pagtagas ng task at tinitiyak ang predictable lifecycle.
Sa Kotlin, ang async/await ay ipinatupad sa pamamagitan ng coroutines — magaan na thread ng wika. Ang function ay minarkahan ng keyword na suspend (katulad ng Swift’s async). Para sa paglunsad, ginagamit ang launch (fire-and-forget) o async (na may resulta). Ang Await ay tinatawag para makuha ang resulta mula sa async.
Dispatcher ay tumutukoy kung saang thread pool isinasagawa ang coroutine: Dispatchers.Main para sa UI, Dispatchers.IO para sa network/disk at Dispatchers.Default para sa CPU-intensive task. Structured Concurrency ay tinitiyak sa pamamagitan ng CoroutineScope — kapag kinansela ang scope, lahat ng child coroutines ay kinakansela rin.
Ayon sa datos ng JetBrains (2025), 97% ng Android applications sa Google Play ay gumagamit ng kotlinx.coroutines, at 82% sa kanila ay gumagamit ng async/await para sa network requests. Ang coroutines ay naging de facto standard para sa asynchronous programming sa Android. Kotlin Multiplatform ay sumusuporta rin sa coroutines, na nagpapahintulot sa paggamit ng shared asynchronous code sa Android, iOS at server side.
Tingnan natin ang dalawang halimbawa para sa bawat wika: sequential data loading at parallel requests gamit ang TaskGroup o async/await.
await ay nagpapatigil ng pagpapatupad hanggang makuha ang data ng user, pagkatapos — hanggang makuha ang mga kaibigan. Walang nested closures.
func loadProfile() async throws -> Profile {
let user = try await api.fetchUser()
let friends = try await api.fetchFriends(for: user.id)
return Profile(user: user, friends: friends)
}
TaskGroup ay nagpapatakbo ng mga task nang magkapareho at nangongolekta ng mga resulta sa array. Ang pagkakasunod-sunod ng mga resulta ay maaaring hindi tumugma sa pagkakasunod-sunod ng paglunsad.
func loadParallel() async throws -> [String] {
await withThrowingTaskGroup(of: String.self) { group in
group.addTask { try await api.fetchName() }
group.addTask { try await api.fetchEmail() }
group.addTask { try await api.fetchAvatar() }
var results = [String]()
for try await value in group { results.append(value) }
return results
}
}
Ang mga suspend function ay maaaring tumawag sa iba pang suspend function. Katulad ng Swift: sequential calls.
suspend fun loadProfile(): Profile {
val user = api.fetchUser()
val friends = api.fetchFriends(user.id)
return Profile(user, friends)
}
Sa Kotlin, ang parallelism ay nakakamit sa pamamagitan ng coroutineScope na may async para sa bawat request.
suspend fun loadParallel(): List<String> = coroutineScope {
val name = async { api.fetchName() }
val email = async { api.fetchEmail() }
val avatar = async { api.fetchAvatar() }
listOf(name.await(), email.await(), avatar.await())
}
Nakalimutang Task { } — ang isang asynchronous function ay hindi maaaring tawagin mula sa synchronous context nang walang pagbabalot sa Task. Sa Swift, ito ay nagiging error sa compilation. Sa Kotlin, kinakailangan ang paglunsad sa pamamagitan ng lifecycleScope o viewModelScope. Ang pagtatangkang tumawag ng suspend function mula sa ordinaryong function ay hindi makaka-compile.
Hindi lahat ng function ay kailangang gawing asynchronous. CPU-intensive task na walang I/O ay hindi nakikinabang mula sa async — mas mainam na isagawa ang mga ito sa DispatchQueue na may .userInitiated QoS. Ang Async/Await ay na-optimize para sa I/O-bound operations: network, disk, paghihintay.
Ang paggamit ng .result sa main thread (synchronous na paghihintay ng resulta ng async function) ay humahantong sa pag-block. Sa Swift, ang Task.synchronousWait ay hindi inirerekomenda ng Apple. Sa Kotlin, ang runBlocking sa main thread ay isang antipattern, gamitin ang lifecycleScope.
Kung ang Task ay hindi nai-save sa property ng class, pagkatapos lumabas sa konteksto ito ay makakansela. Sa Swift, ang Task ay scoped — ang lifecycle nito ay nakatali sa lumikha na konteksto. I-save ang Task sa property kung kinakailangan ang long-running operation.
Mga Madalas Itanong
Async/Await — ay isang language construct na hindi nangangailangan ng paggawa ng queues. DispatchQueue — ay isang system API para sa pamamahala ng mga thread. Ang async/await ay kino-compile sa state machine sa antas ng wika, ang GCD — sa syscall sa antas ng OS.
Hindi — ang await ay nagpapatigil sa function, ngunit pinalalaya ang thread para sa iba pang mga task. Pagkatapos makumpleto ang operasyon, ang function ay magpapatuloy sa anumang available na thread mula sa pool.
Oo — sa pamamagitan ng Task.cancel() sa Swift o Job.cancel() sa Kotlin. Ang pagkansela ay kumakalat sa lahat ng child task ayon sa Structured Concurrency. Ang code mismo ay sumusuri sa cancellation flag sa pamamagitan ng Task.isCancelled o ensureActive().
MainActor — ay isang actor na ang mga property at method ay palaging isinasagawa sa main thread. Sa pamamagitan ng pagmamarka ng function na @MainActor, ginagarantiyahan mo na ang UI updates ay nangyayari sa tamang thread, pinapalitan ang DispatchQueue.main.async.
Ang Async/Await ay available sa Swift (iOS 13+), Kotlin (sa pamamagitan ng kotlinx.coroutines), Dart (Flutter), JavaScript/TypeScript, Python, C#, Rust at Go (sa pamamagitan ng goroutines na may syntactic sugar).
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din