Async və await mexanizmləri necə işləyir?
sobes.tech Süni İntellekt
AI-dan cavab
Swift-də Async/await, strukturlaşdırılmış mübarizə əsasında qurulmuşdur və Dispatch/Global Actors istifadə edir. Arxa planda işləyən mexanizmlər bunlardır:
-
Davam Stili: Asinxron funksiyalar davamlar stilində tərtib olunur. Dərhal bir dəyər qaytarmak əvəzinə, idarə Swift çalışma vaxtına ötürülür və funksiyanın hazırkı vəziyyəti (yerli dəyişənlər, icra göstəricisi) saxlanılır. Asinxron əməliyyat tamamlandıqda, çalışma vaxtı funksiyanı saxlanılan vəziyyətdən davam etdirir.
-
Tapşırıq: Hər
asyncfunksiyasının çağırışı strukturlaşdırılmışTaskyaradır və ya ona qoşulur.Task, iş vahidini təmsil edir və bir hierarşi qurur. ValideynTask, uşaqlarTask-larının tamamlanmasını gözləyir. -
İş:
Task, daha kiçik iş vahidlərinə, yəniJob-lara bölünür. BirJob, icraçıda icra oluna biləcək kod parçasını təmsil edir. -
İcraçı: İcraçı,
Job-u başlatmaq üçün məsuliyyət daşıyır. Standart kitabxanada, çox vaxtDispatchQueueqlobal olaraq istifadə olunur və bu, əksər asinxron tapşırıqlar üçün icraçı kimi xidmət edir. Xüsusi kontekstlər (məsələn,MainActor) öz ixtisaslaşmış icraçılarına malikdir. -
Dayandırma Nöqtələri:
await, dayandırma nöqtəsidir. Bu nöqtəyə çatdıqda, funksiya dayandırılır, idarə çağıran kod və ya icraçıya ötürülür və cariJobtamamlanır. Swift çalışma vaxtı funksiyanın vəziyyətini saxlayır. -
Yenidən Başlatma:
awaitilə gözlənilən asinxron əməliyyat tamamlandıqda, Swift çalışma vaxtı yeni birJobyaradır və dayandırılmış funksiyanın icrasına davam edir. BuJob, icraçı növbəsinə əlavə olunur. -
İmtina: Strukturlaşdırılmış uyğun gələnlik, hierarşik imtina dəstəyinə malikdir. Valideyn
Task-ın imtinası, avtomatik olaraq onun bütün uşaqTask-larını imtina edir. Asinxron əməliyyatlar, imtina vəziyyətini yoxlaya və uyğun cavab verə bilər.
Budur, async funksiyasının tərtibinə aid sadələşdirilmiş nümunə:
// Orijinal async funksiya
func fetchData() async -> Data {
// Asinxron əməliyyat
let data = await URLSession.shared.data(from: url).0
return data
}
// Sadələşdirilmiş tərtib nümunəsi
// Döndürmək əvəzinə, funksiya Continuation qəbul edir
func fetchData(_ continuation: Continuation<Data, Error>) {
// Funksiyanın başlanğıc kodu
let url = URL(string: "...")! // Nümunə
// Asinxron əməliyyatı başlat
URLSession.shared.data(from: url) { data, _, error in
// Bu bağlama, asinxron əməliyyat tamamlandıqdan sonra icra olunur
if let data = data {
// Nəticəni continuation-a ötür, funksiyanı yenidən başlat
continuation.resume(returning: data)
} else if let error = error {
continuation.resume(throwing: error)
} else {
// Digər halların işlənməsi
continuation.resume(throwing: NSError(domain: "", code: 0, userInfo: nil))
}
}
// Funksiya burada sona çatır, resume çağırışını gözləyir
}
Await, əsasən, Continuation idarəçiliyi və Job planlaması üzərində sintaktik şəkərdir. Dayanma, birbaşa axını bloklamır, əksinə icraçıya digər Job-ları yerinə yetirməyə imkan verir.