Sobes.tech
Middle

Grand Central Dispatch və iOS inkişafında istifadəsi haqqında nə deyə bilərsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Grand Central Dispatch (GCD) — bu aşağı səviyyəli API-dir çoxmərhələli əməliyyatların idarə olunması üçün, çox nüvəli prosessorlarda tapşırıqların asinxron icrası konsepsiyasına əsaslanır. O, sistem tərəfindən idarə olunan işçi hovuzları təqdim edir və proqramçıya işçi axınlarının yaradılması və idarə olunmasından azad edir.

Əsas komponentlər:

  • Dispatch Queue-lər: İş bloklarını (workItem) saxlamaq üçün verilənlər strukturları. Tapşırıqlar əlavə olunma ardıcıllığında icra olunur.

    • Serial Queue-lər: Tapşırıqları bir-bir icra edir, əlavə olunma ardıcıllığında. İcra sırasını və məlumatların təhlükəsizliyini təmin edir, yalnız bir queue-də dəyişdirilən məlumatlar üçün.
    • Parallel Queue-lər: Tapşırıqları paralel icra edir, mövcud sistem resurslarından istifadə etməklə. Tapşırıqların tamamlanma ardıcıllığı təmin edilmir.
      • Qlobal paralel queue-lər: Sistem tərəfindən müxtəlif prioritetlərlə (qos) təqdim olunur: .userInteractive, .userInitiated, .default, .utility, .background.
    • Main Queue: Xüsusi serial queue, tətbiqin əsas axını ilə əlaqəlidir (main thread). UI yeniləmələri üçün istifadə olunur.
  • Work Items: GCD tərəfindən göndərilən bağlamalar (closures) və ya funksiyalar.

  • Dispatch Groups: Tapşırıqları bir neçə queue-də icra etməyə və qrupdakı bütün tapşırıqlar tamamlandıqda bildiriş almağa imkan verir.

  • Dispatch Semaphores: Resursa eyni zamanda müraciət edən işçi sayını məhdudlaşdırmaq və ya işçi axınları arasında sinxronizasiya üçün mexanizm.

iOS inkişafında istifadəsi:

  • Asinxron tapşırıq icrası: Resurs tələb edən əməliyyatların (şəbəkə sorğuları, verilənlər bazası ilə işləmə, şəkil emalı) əsas axından fon queue-lərinə köçürülməsi UI-nin cavabdehliyini qorumaq üçün.
    let queue = DispatchQueue.global(qos: .userInitiated)
    queue.async {
        // Resurs tələb edən əməliyyatın icrası
        let result = performHeavyCalculation()
    
        DispatchQueue.main.async {
            // UI-nin yenilənməsi əsas axında
            self.updateUI(with: result)
        }
    }
    
  • Sinxronizasiya:
    • Resurslara girişin məhdudlaşdırılması üçün semaforlar.
      let semaphore = DispatchSemaphore(value: 1) // Bir işçinin girişinə imkan verir
      semaphore.wait() // Semafor əlçatan olana qədər gözləyir
      // Paylaşılan resursa giriş
      semaphore.signal() // Semaforu azad edir
      
    • Məlumatların təhlükəsizliyini təmin etmək üçün serial queue-lər.
  • Tapşırıqların qrup şəklində icrası: Bir neçə asinxron tapşırığın icrası və onların tamamlanmasını gözləmək.
    let group = DispatchGroup()
    let concurrentQueue = DispatchQueue.global()
    
    group.enter() // Qrupa daxil olma
    concurrentQueue.async {
        // Tapşırıq 1
        print("Tapşırıq 1 tamamlandı")
        group.leave() // Qrupdan çıxış
    }
    
    group.enter()
    concurrentQueue.async {
        // Tapşırıq 2
        print("Tapşırıq 2 tamamlandı")
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Bütün tapşırıqlar tamamlandı
        print("Bütün tapşırıqlar tamamlandı")
    }
    
  • Gecikdirilmiş icra: Kodun müəyyən bir vaxt keçdikdən sonra icrası.
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Kod 2 saniyə sonra icra olunacaq
        print("Gecikdirilmiş icra")
    }
    

GCD-nin üstünlükləri:

  • İstifadəsinin sadəliyi, əl ilə idarə olunan işçi axınlarına nisbətən.
  • Sistem tərəfindən idarə olunan işçi hovuzunun optimallaşdırılması, çox nüvəli prosessorlar üçün.
  • Resursların effektiv istifadəsi.
  • İşçi axınlarının idarə olunması ilə əlaqəli problemlərin qarşısını almaq (yarış vəziyyətləri, qarşılıqlı bloklamalar).

GCD-nin çatışmazlıqları:

  • Bəzi mürəkkəb ssenarilərdə əl ilə idarə olunan işçi axınlarından daha az çevik.
  • Çox işçi iplikli kodun ayıklanması çətin ola bilər.