Sobes.tech
Junior

GCD (Grand Central Dispatch) nədir və iOS inkişafında necə istifadə olunur?

sobes.tech Süni İntellekt

AI-dan cavab

GCD (Grand Central Dispatch) — bu texnologiya aşağı səviyyəli paralelliyi Apple-dən, C əsasında qurulmuş, lakin Swift və Objective-C-də rahat qabıqla təmin edən. O, iş elementləri (work items) və onların asinxron və ya sinxron icrasını mövcud prosessor nüvələrində idarə edən mexanizmi təqdim edir.

Əsas GCD konseptləri:

  1. Dispatch Queue-lər: Tapşırıqları yerinə yetirmək üçün növbələr. İki növü var:

    • Serial Queue-lər: Tapşırıqlar ardıcıl olaraq yerinə yetirilir. Ümumi resurslara girişdə yarış vəziyyətlərinin qarşısını alır.
    • Concurrent Queue-lər: Tapşırıqlar paralel olaraq yerinə yetirilir (amma onların başlaması və tamamlanma sırası təmin edilmir). Müstəqil tapşırıqları yerinə yetirmək üçün istifadə olunur.
    • Main Queue: Xüsusi ardıcıl növbə, tətbiqin əsas axını ilə əlaqələndirilmişdir. UI yeniləmələri üçün istifadə olunur. UI ilə əlaqəli bütün tapşırıqlar bu növbədə yerinə yetirilməlidir.
  2. Work Items (Closures/Blocks): Yerinə yetiriləcək ayrı-ayrı tapşırıq blokları.

  3. Dispatch Group: Tapşırıqları qruplaşdırmağa və hamısı tamamlandıqda bildiriş almağa imkan verir.

  4. Dispatch Semaphores: Məhdud resurslara girişin idarə olunması üçün sinxronizasiya primitivi.

iOS inkişafında istifadəsi:

  • Ağır əməliyyatların fon rejimində yerinə yetirilməsi: Şəbəkə sorğuları, şəkil emalı, verilənlər bazası ilə işləmə kimi tapşırıqları əsas növbədən (main queue) fon növbələrinə (məsələn, qlobal concurrent queues) köçürmək UI-nin bloklanmasının qarşısını almaq üçün.

    // Asinxron tapşırığın qlobal paralel növbədə yerinə yetirilməsi
    DispatchQueue.global(qos: .userInitiated).async {
        // Ağır əməliyyat
        let result = performHeavyOperation()
    
        // UI-ni əsas axında yeniləmək
        DispatchQueue.main.sync {
            updateUI(with: result)
        }
    }
    
  • UI yeniləməsi: Həmişə istifadəçi interfeysinin dəyişdirilməsi əməliyyatlarını main queue-də yerinə yetirmək.

    // UI-ni əsas axında yeniləmək
    DispatchQueue.main.async {
        self.label.text = "Yeniləndi!"
    }
    
  • Məlumatlara girişin serializasiyası: Ümumi dəyişən resurslara sinxron giriş üçün istifadəçi tərəfindən yaradılmış ardıcıl növbələrdən istifadə.

    // Sinxron giriş üçün serial növbə nümunəsi
    let dataAccessQueue = DispatchQueue(label: "com.myapp.dataaccess")
    
    func updateSharedData(newValue: Int) {
        dataAccessQueue.async {
            // Ümumi məlumatların təhlükəsiz dəyişdirilməsi
            sharedData = newValue
        }
    }
    
  • Tapşırıqların qruplaşdırılması: Bir neçə asinxron tapşırığın tamamlanmasını gözləmək və sonra növbəti addıma keçmək.

    // Tapşırıq qrupu
    let group = DispatchGroup()
    
    group.enter() // 1-ci tapşırığın başlanğıcı
    performAsyncOperation1 {
        print("Tapşırıq 1 tamamlandı")
        group.leave()
    }
    
    group.enter() // 2-ci tapşırığın başlanğıcı
    performAsyncOperation2 {
        print("Tapşırıq 2 tamamlandı")
        group.leave()
    }
    
    // Bütün tapşırıqlar tamamlandıqda bildiriş
    group.notify(queue: .main) {
        print("Bütün tapşırıqlar tamamlandı, UI yenilənir")
        // UI yeniləməsi
    }
    
  • Gecikdirilmiş yerinə yetirmə: Kodun müəyyən bir vaxt keçdikdən sonra yerinə yetirilməsi.

    // 2 saniyə sonra gecikdirilmiş yerinə yetirmə
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        print("2 saniyə sonra başladıldı")
    }
    

GCD çox nüvəli prosessorlardan səmərəli istifadə və ənənəvi (məsələn, Thread) ilə müqayisədə daha yüksək səviyyəli və effektiv çoxluq idarəetmə yanaşması təmin edir.