Async/Await — sinxron üslubda asinxron kod yazmaq üçün açar sözlər cütüdür, Swift-də iOS 13-dən və Kotlin-də korutinlərlə mövcuddur. Apple Swift Documentation, 2026-ya görə, Async/Await callback zəncirini və GCD-ni əvəz edərək asinxron kodu xətti və oxunaqlı edir. async açar sözü funksiyanı asinxron olaraq işarələyir, await isə nəticə alınana qədər onun icrasını dayandırır.
Əsas məqamlar
Async/Await — asinxron kodu sinxron kimi xətti yazmağa imkan verən dil konstruksiyasıdır. Swift-də iOS 13 / macOS 10.15 ilə birlikdə Swift Concurrency frameworku ilə ortaya çıxdı. Kotlin-də async/await kotlinx.coroutines kitabxanası vasitəsilə 1.3 versiyasından etibarən mövcuddur.
Async/await-dan əvvəl asinxron kod callback-lər, GCD və ya RxSwift üzərində qurulurdu. İç-içə callback zəncirleri callback hell-ə — oxuma və debug-u çətinləşdirən dərin iç-içəliyə səbəb olurdu. Async/Await bu problemi həll edir, asinxron funksiyaların await nöqtələrində “dayanmasına” və nəticə alındıqdan sonra bərpa olunmasına imkan verir.
Google (2025) məlumatlarına görə, Kotlin-də async/await istifadəsi asinxron kodun sətir sayını callback yanaşması ilə müqayisədə 40–60% azaldır. Swift-də Swift Concurrency-nin qəbulu 2025-ci ildə nəşr olunan tətbiqlər arasında 68%-ə çatdı. iOS 16 UIKit, SwiftUI və Foundation-da Swift Concurrency dəstəyini əlavə etdi ki, bu da async/await-ı bütün yeni Apple layihələri üçün standart alətə çevirdi.
Async/await-ın iplərdən əsas fərqi — bloklamadan dayandırma. Funksiya await ilə qarşılaşdıqda dayanır, cari ipi digər tapşırıqlar üçün boşaldır. Asinxron əməliyyat tamamlandıqdan sonra funksiya eyni və ya başqa ipdə bərpa olunur. Buna kooperativ multitasking deyilir.
Async funksiyası icra vəziyyətlərini idarə edən sonlu avtomat — state machine-ə kompilyasiya olunur. await nöqtəsində kompilyator konteksti (lokal dəyişənlər, qayıdış ünvanı) saxlayır və idarəni runtime-ə ötürür. Nəticə hazır olduqda runtime konteksti bərpa edir və icranı davam etdirir.
Swift-də bu state machine SIL (Swift Intermediate Language) kompilyatoru səviyyəsində həyata keçirilir. Kotlin-də — Continuation Passing Style (CPS) mexanizmi vasitəsilə: hər bir suspend funksiyası gizli Continuation parametri qəbul edir, onun vasitəsilə nəticə qaytarılır. Hər iki yanaşma yaddaş sızması olmadan təhlükəsiz bərpanı təmin edir.
Callback yanaşması əməliyyat tamamlandıqdan sonra çağırılan closure-un ötürülməsini tələb edir. Ardıcıl üç sorğuda hər səviyyədə xəta idarəetməsi ilə üç iç-içə səviyyə yaranır. Async/Await eyni üç sorğunu vahid catch bloku ilə üç ardıcıl sətirə çevirir.
GCD (DispatchQueue) callback hell problemini serial növbələr və DispatchGroup vasitəsilə həll edir, lakin çoxsözlü qalır. Sadə bir tapşırıq — user, sonra friends, sonra UI yükləmək — növbələr, qruplar və notify bloklarının yaradılmasını tələb edir. Async/Await eyni tapşırığı bir funksiyada üç sətirlə yerinə yetirir.
| Aspekt | Callback | GCD | Async/Await |
|---|---|---|---|
| İç-içəlik | Dərin (ölüm piramidası) | Orta (qruplar+notify) | Xətti (düz) |
| Xəta idarəetməsi | Hər callback-də | Əl ilə | Vahid (try/catch) |
| Ləğv etmə | Əl ilə | Məhdud | Task.cancel() |
| Thread safety | Əl ilə | Serial queue vasitəsilə | MainActor vasitəsilə |
Apple WWDC 2024-ə görə, Swift Concurrency async/await yeni kod üçün tövsiyə olunan yanaşmadır. GCD C kitabxanaları ilə inteqrasiya və spesifik aşağı səviyyəli ip emalı ssenariləri üçün qalır.
Task — Swift-də asinxron işin əsas vahididir. Task mövcud aktor kontekstində və ya ixtiyari ipdə yaradılır. Task daxilində await vasitəsilə async funksiyaları çağırmaq olar. TaskGroup bir neçə uşaq tapşırığını paralel işə salmağa və onların nəticələrini toplamağa imkan verir — steroidli DispatchGroup analoqu.
Actor — öz vəziyyətini məlumat yarışlarından qoruyan thread-safe referans tipidir. Kompilyator zəmanət verir ki, aktorun xassələrinə giriş yalnız async çağırışları və ya aktor izolyasiyası daxilində mümkündür. Actor əl blokadaları olmadan paylaşılan dəyişkən vəziyyəti qorumaq üçün serial DispatchQueue-ni əvəz edir.
Structured Concurrency prinsipi deyir: hər bir asinxron tapşırığın valideyni var və valideyn bütün uşaq tapşırıqları tamamlanana qədər bitmir. Əgər tapşırıq A Task { await B() } işə salırsa, A B-ni gözləyir. Bu, tapşırıq sızmalarının qarşısını alır və proqnozlaşdırıla bilən həyat dövrü təmin edir.
Kotlin-də async/await coroutines — dilin yüngül ipləri vasitəsilə həyata keçirilir. Funksiya suspend açar sözü ilə işarələnir (Swift async-in analoqu). İşə salmaq üçün launch (at-və-unut) və ya async (nəticə ilə) istifadə olunur. Await async-dən nəticə almaq üçün çağırılır.
Dispatcher korutinanın hansı ip hovuzunda icra olunacağını müəyyən edir: UI üçün Dispatchers.Main, şəbəkə/disk üçün Dispatchers.IO və CPU intensiv tapşırıqlar üçün Dispatchers.Default. Structured Concurrency CoroutineScope vasitəsilə təmin edilir — scope ləğv edildikdə bütün uşaq korutinalar ləğv olunur.
JetBrains (2025) məlumatlarına görə, Google Play-də Android tətbiqlərinin 97%-i kotlinx.coroutines istifadə edir və onların 82%-i şəbəkə sorğuları üçün async/await tətbiq edir. Coroutines Android-də asinxron proqramlaşdırma üçün de-fakto standarta çevrilib. Kotlin Multiplatform da korutinaları dəstəkləyir, Android, iOS və server tərəfində ümumi asinxron koddan istifadəyə imkan verir.
Hər dil üçün iki nümunəyə baxaq: ardıcıl məlumat yükləmə və TaskGroup və ya async/await ilə paralel sorğular.
await istifadəçi məlumatları alınana qədər icranı dayandırır, sonra — dostlar alınana qədər. Heç bir iç-içə closure yoxdur.
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 tapşırıqları paralel işə salır və nəticələri massivdə toplayır. Nəticələrin sırası işə salma sırası ilə üst-üstə düşməyə bilər.
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
}
}
suspend funksiyaları digər suspend funksiyalarını çağıra bilər. Swift analoqu: ardıcıl çağırışlar.
suspend fun loadProfile(): Profile {
val user = api.fetchUser()
val friends = api.fetchFriends(user.id)
return Profile(user, friends)
}
Kotlin-də paralellik hər sorğu üçün async ilə coroutineScope vasitəsilə əldə edilir.
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())
}
Unudulmuş Task { } — asinxron funksiyanı sinxron kontekstdən Task-a bükülmədən çağırmaq olmaz. Swift-də bu kompilyasiya xətası verir. Kotlin-də lifecycleScope və ya viewModelScope vasitəsilə işə salma tələb olunur. Adi funksiyadan suspend funksiyasını çağırmaq cəhdi kompilyasiya olunmayacaq.
Hər funksiyanı asinxron etmək lazım deyil. CPU intensiv I/O-siz tapşırıqlar async-dən faydalanmır — onları .userInitiated QoS ilə DispatchQueue-da yerinə yetirmək daha yaxşıdır. Async/Await I/O-bound əməliyyatları üçün optimallaşdırılıb: şəbəkə, disk, gözləmə.
Əsas ipdə .result istifadəsi (async funksiyasının nəticəsinin sinxron gözlənməsi) bloklanmaya səbəb olur. Swift-də Task.synchronousWait Apple tərəfindən tövsiyə edilmir. Kotlin-də əsas ipdə runBlocking antipattern-dir — lifecycleScope istifadə edin.
Əgər Task sinifin xassəsinə saxlanmırsa, kontekstdən çıxdıqdan sonra ləğv edilir. Swift-də Task scoped-dir — onun həyat dövrü yaradan kontekstə bağlıdır. Uzunmüddətli əməliyyat lazım olduqda Task-ı xassədə saxlayın.
Tez-tez verilən suallar
Async/Await — növbələrin yaradılmasını tələb etməyən dil konstruksiyasıdır. DispatchQueue — ipləri idarə etmək üçün sistem API-sidir. Async/await dil səviyyəsində state machine-ə, GCD isə OS səviyyəsində syscall-a kompilyasiya olunur.
Xeyr — await funksiyanı dayandırır, lakin ipi digər tapşırıqlar üçün boşaldır. Əməliyyat tamamlandıqdan sonra funksiya hovuzdan istənilən mövcud ipdə bərpa olunur.
Bəli — Swift-də Task.cancel() və ya Kotlin-də Job.cancel() vasitəsilə. Ləğv Structured Concurrency-ə uyğun olaraq bütün uşaq tapşırıqlara yayılır. Kod ləğv bayrağını Task.isCancelled və ya ensureActive() vasitəsilə yoxlayır.
MainActor — xassələri və metodları həmişə əsas ipdə icra olunan aktordur. Funksiyanı @MainActor ilə işarələyərək, UI yeniləmələrinin düzgun ipdə baş verdiyinə zəmanət verirsiniz, DispatchQueue.main.async-i əvəz edir.
Async/Await Swift (iOS 13+), Kotlin (kotlinx.coroutines vasitəsilə), Dart (Flutter), JavaScript/TypeScript, Python, C#, Rust və Go-da (sintaktik şəkərlə goroutines vasitəsilə) mövcuddur.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun