Sobes.tech
Senior

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:

  1. 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.

  2. Tapşırıq: Hər async funksiyasının çağırışı strukturlaşdırılmış Task yaradır və ya ona qoşulur. Task, iş vahidini təmsil edir və bir hierarşi qurur. Valideyn Task, uşaqlar Task-larının tamamlanmasını gözləyir.

  3. İş: Task, daha kiçik iş vahidlərinə, yəni Job-lara bölünür. Bir Job, icraçıda icra oluna biləcək kod parçasını təmsil edir.

  4. İcraçı: İcraçı, Job-u başlatmaq üçün məsuliyyət daşıyır. Standart kitabxanada, çox vaxt DispatchQueue qlobal 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.

  5. 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ə cari Job tamamlanır. Swift çalışma vaxtı funksiyanın vəziyyətini saxlayır.

  6. Yenidən Başlatma: await ilə gözlənilən asinxron əməliyyat tamamlandıqda, Swift çalışma vaxtı yeni bir Job yaradır və dayandırılmış funksiyanın icrasına davam edir. Bu Job, icraçı növbəsinə əlavə olunur.

  7. İ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şaq Task-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.