DispatchQueue: bu nədir, GCD növbəsi və çoxiplik əsasları

Müəllif: IT Sectr Dərc olunub: 2026-03-16 Oxuma vaxtı: 8 dəq

DispatchQueue iOS və macOS-da asinxron tapşırıqları idarə etmək üçün Grand Central Dispatch (GCD) çərçivəsinin fundamental növbəsidir. Apple Developer Documentation, 2026-ya görə, DispatchQueue serial və concurrent növbələri vasitəsilə ip idarəetməsini tərtibatçıdan abstraksiya edir. GCD tapşırıqları sistem ip hovuzu üzrə avtomatik paylayır, iplərin əl ilə yaradılması və məhv edilməsi ehtiyacını aradan qaldırır.

Əsas məqamlar

  • DispatchQueue — iOS-da asinxron kod icrası üçün GCD-nin əsas abstraksiyası
  • Serial növbə tapşırıqları ciddi ardıcıl icra edir, yarış vəziyyətini aradan qaldırır
  • Concurrent növbə sistem ip hovuzu vasitəsilə bir neçə tapşırığı paralel icra edir
  • QoS tapşırığın prioritetini təyin edir — userInteractive-dən background-a qədər
  • DispatchQueue.main — UIKit-i əsas ipdə yeniləmək üçün yeganə növbə

DispatchQueue və Grand Central Dispatch nədir

DispatchQueue — sistem və ya fərdi ip növbələrində tapşırıqların icrasını idarə edən Grand Central Dispatch (GCD) çərçivəsinin obyektidir. Grand Central Dispatch — iOS 4 və macOS 10.6-dan etibarən mövcud olan Apple-ın aşağı səviyyəli kitabxanasıdır və o, ip idarəetməsini tərtibatçıdan tamamilə abstraksiya edir. GCD əməliyyat sisteminin ip hovuzundan istifadə edir və cihazın yükünə uyğun olaraq iplərin sayını avtomatik miqyaslandırır.

Tərtibatçı ipləri əl ilə yaratmalı və məhv etməli deyil — GCD bu vəzifəni öz üzərinə götürür və DispatchQueue vasitəsilə sadə API təqdim edir. Tapşırıq closure (bağlama) şəklində sync və ya async metodları vasitəsilə növbəyə göndərilir. Birinci halda çağıran ip tapşırıq tamamlanana qədər bloklanır, ikinci halda isə dərhal icranı davam etdirir.

Apple (2026) məlumatlarına görə, GCD nüvələrin sayına və prosessorun cari yükünə uyğunlaşan sistem ip hovuzundan istifadə edir. Concurrent növbə hər tapşırıq üçün yeni ip yaratmır — GCD hovuzdan ipləri təkrar istifadə edir ki, bu da ip yaradılması üzrə əlavə xərcləri minimuma endirir.

GCD arxitekturası

Grand Central Dispatch üç əsas komponentdən ibarətdir: növbə (DispatchQueue), qrup (DispatchGroup) və semafor (DispatchSemaphore). Növbə əsas elementdir, kod blokları şəklində tapşırıqları qəbul edir. DispatchGroup bir neçə tapşırığın icrasını sinxronlaşdırır, DispatchSemaphore isə ümumi resursa müəyyən sayda iplərin girişini məhdudlaşdırır.

Hər bir GCD növbəsi müəyyən QoS (Quality of Service) sinfi ilə əlaqələndirilir ki, bu da sistemə tapşırığın vacibliyi barədə məlumat verir. Sistem QoS-dən növbələr arasında prosessor vaxtını bölüşdürmək üçün istifadə edir, daha kritik tapşırıqlara — məsələn, UI yeniləməsi və ya istifadəçi toxunuşlarının işlənməsinə — üstünlük verir.

Serial və Concurrent növbələri: müqayisə

Serial növbə tapşırıqları ciddi ardıcıl, bir-birinin ardınca icra edir. Serial növbəyə üç tapşırıq yerləşdirilərsə, ikinci tapşırıq yalnız birinci tamamlandıqdan sonra başlayır. Serial növbələr ümumi resurslara girişi sinxronlaşdırmaq üçün istifadə olunur — məsələn, kodun bir neçə hissəsindən dəyişdirilən massivə giriş.

Concurrent növbə bir neçə tapşırığı eyni vaxtda icra edir, onları sistem hovuzundan mövcud iplər arasında bölüşdürür. Concurrent növbədə tapşırıqlar daxil olma ardıcıllığı ilə (FIFO) başlayır, lakin icra müddətləri fərqlidirsə, təsadüfi ardıcıllıqla bitir. Concurrent növbə bitmə ardıcıllığına zəmanət vermir — yalnız başlama ardıcıllığına.

ParametrSerial növbəConcurrent növbə
İcra ardıcıllığıCiddi ardıcılParalel
İp sayıBirGCD hovuzundan bir neçə
TətbiqPaylaşılan resursların qorunmasıMüstəqil hesablamalar
Main queueBəli (əsas ip)Xeyr
Deadlock riskiEyni növbədə sync zamanı yüksəkAşağı

Serial növbəni nə vaxt seçməli

Serial növbə ümumi vəziyyəti dəyişdirən tapşırıqlar üçün idealdır — fayla yazmaq, məlumat modelini yeniləmək və ya Core Data ilə işləmək. Serial növbədən istifadə kodun iki hissəsinin eyni məlumatları eyni vaxtda dəyişməməsinə zəmanət verir, əlavə bloklamalar olmadan yarış vəziyyətini aradan qaldırır.

Concurrent növbəni nə vaxt seçməli

Concurrent növbə bir-birindən asılı olmayan tapşırıqlar üçün uyğundur: bir neçə şəklin yüklənməsi, paralel şəbəkə sorğuları və ya məlumatların toplu işlənməsi. GCD prosessor nüvələrinin sayına və sistemin cari yükünə əsasən eyni vaxtda neçə tapşırığın işə salınacağını avtomatik qərar verir.

Quality of Service: tapşırıqların icra prioritetləri

QoS (Quality of Service) — əməliyyat sisteminə tapşırığın vacibliyi və təxirəsalınmazlığı barədə məlumat verən GCD mexanizmidir. Sistem iplərin planlaşdırılması üçün QoS-dən istifadə edir: daha yüksək QoS olan tapşırıqlar daha çox prosessor vaxtı alır və daha tez işə salınır. QoS dəyəri növbə yaradılarkən və ya konkret tapşırıq göndərilərkən ötürülür.

GCD-də beş QoS sinfi mövcuddur. .userInteractive — UI ilə əlaqəli tapşırıqlar üçün ən yüksək prioritet. .userInitiated — istifadəçi tərəfindən başladılan tapşırıqlar üçün. .utility — gedişatı göstərilən fon tapşırıqları üçün. .background — istifadəçiyə görünməyən tapşırıqlar üçün. .default — userInitiated və utility arasında aralıq səviyyə, standart olaraq istifadə olunur.

Apple (2026) məlumatlarına görə, QoS-in səhv seçilməsi performans problemlərinin tez-tez rast gəlinən səbəblərindən biridir. QoS .userInteractive ilə fon yükləməsinin işə salınması UI-dan resursları alır, animasiyalarda mikro-laglara səbəb olur. Məqbul icra müddətini təmin edən ən aşağı QoS-in seçilməsi tövsiyə olunur.

QoS tətbiq nümunəsi

Dərhal göstərilmək üçün şəkil yüklənərkən .userInitiated istifadə edin — istifadəçi nəticə gözləyir. Növbəti ekranın əvvəlcədən yüklənməsi üçün .utility kifayətdir. Serverlə fon sinxronizasiyası .background ilə icra olunur, aktiv tapşırıqlara təsiri minimuma endirir.

DispatchGroup və semaforlar: tapşırıqların sinxronlaşdırılması

DispatchGroup bir qrup tapşırığın tamamlanmasını izləməyə imkan verir. Qrupdakı bütün tapşırıqlar tamamlandıqda, GCD göstərilən növbədə notify handler-i çağırır. Bu, bir neçə müstəqil resurs yüklənərkən — profil məlumatları, dost siyahısı və parametrlər — interfeys yalnız bütün məlumatlar alındıqdan sonra yenilənməli olduqda xüsusilə faydalıdır.

DispatchGroup sinxron çağırış wait()-ı dəstəkləyir, bu da bütün tapşırıqlar tamamlanana qədər cari ipi bloklayır. Bu, kod qrupun nəticələri olmadan davam edə bilmədikdə rahatdır. Asinxron variant — notify() — bütün tapşırıqlar tamamlandıqdan sonra göstərilən növbədə closure çağırır, çağıran ipi bloklamadan.

Paralelliyi məhdudlaşdırmaq üçün DispatchSemaphore

DispatchSemaphore resursa girişi idarə edir, eyni vaxtda girişlərin sayını məhdudlaşdırır. İlkin dəyəri 3 olan semafor üçdən çox olmayan paralel tapşırığı işə salmağa imkan verir. wait() çağırıldıqda sayğac azalır, signal() çağırıldıqda isə artır. Sayğac sıfırdırsa, ip resurs boşalana qədər bloklanır.

Swift-də DispatchQueue ilə kod nümunələri

Swift-də DispatchQueue istifadəsinin üç praktik nümunəsini nəzərdən keçirək. Birinci nümunə əsas async çağırışını əsas ipə qayıtmaqla göstərir, ikincisi — serial növbə vasitəsilə sinxronizasiyanı, üçüncüsü — paralel sorğular üçün DispatchGroup-u.

Main-ə qayıtmaqla əsas async çağırışı

DispatchQueue.main — əsas ipin serial növbəsidir, yalnız UI əməliyyatları üçün nəzərdə tutulub. Fon işi tamamlandıqdan sonra interfeysi yeniləmək üçün həmişə ondan istifadə edin.

swift
let queue = DispatchQueue.global(qos: .userInitiated)
queue.async {
    let data = self.fetchData()
    DispatchQueue.main.async {
        self.updateUI(with: data)
    }
}

Ümumi resursun qorunması üçün serial növbə

Unikal identifikatorla öz serial növbənizi yaratmaq dəyişən massivə girişi sinxronlaşdırır. Bütün oxuma və yazma əməliyyatları bir növbədən keçir, yarış vəziyyətini aradan qaldırır.

swift
let serialQueue = DispatchQueue(label: "com.app.items")
var items: [Int] = []

serialQueue.async {
    items.append(1)
}
serialQueue.async {
    let last = items.last
    DispatchQueue.main.async {
        print("Last item: \(last)")
    }
}

Paralel sorğular üçün DispatchGroup

DispatchGroup concurrent növbədə bir neçə tapşırığı işə salmağa və hamısının tamamlanması barədə bildiriş almağa imkan verir. Bu, profil ekranı üçün məlumat yüklənərkən faydalıdır.

swift
let group = DispatchGroup()
let worker = DispatchQueue.global()

worker.async(group: group) { self.loadProfile() }
worker.async(group: group) { self.loadFriends() }
worker.async(group: group) { self.loadSettings() }

group.notify(queue: DispatchQueue.main) {
    self.showCompleteUI()
}

DispatchQueue ilə işləyərkən tipik səhvlər

Deadlock serial növbədə sync çağırışı zamanı — ən geniş yayılmış səhvdir. Serial növbədəki tapşırıq eyni növbədə queue.sync çağırarsa, ip əbədi olaraq bloklanır. Növbə cari tapşırığın tamamlanmasını gözləyir, tapşırıq isə sync çağırışının tamamlanmasını gözləyir — klassik qarşılıqlı bloklama.

Fon ipindən UI-nin yenilənməsi

UIKit ilə bütün əməliyyatlar əsas ipdə yerinə yetirilməlidir. Xcode Debug rejimində Main Thread Checker vasitəsilə bu səhvləri aşkarlayır. Release quruluşunda onlar gözlənilməz davranışa səbəb olur: animasiyalar işə düşmür, UI yenilənmir, crash-lər mümkündür.

Həddindən artıq fərdi növbələrin yaradılması

Qlobal növbələr əvəzinə yüzlərlə fərdi növbənin yaradılması — anti-nümunədir. Hər növbə sistem resurslarını istehlak edir. Əksər tapşırıqlar üçün müxtəlif QoS ilə qlobal concurrent növbələr və paylaşılan məlumatların sinxronizasiyası üçün bir-iki serial növbə kifayətdir.

Dövrlərdə autoreleasepool-un nəzərə alınmaması

autoreleasepool olmadan fon növbəsində resurs tutumlu dövri tapşırıqlar yerinə yetirilərkən yaddaş bütün dövrün sonuna qədər artır. ARC obyektləri yalnız autorelease pool-dan çıxarkən boşaldır. Dövr iterasiyalarını vaxtında yaddaş boşaldılması üçün autoreleasepool { } içinə yerləşdirin.

Tez-tez verilən suallar

DispatchQueue və OperationQueue arasında fərq nədir?

OperationQueue GCD üzərində qurulub, lakin əməliyyat asılılıqları, KVO və ləğvetmə dəstəyi ilə daha yüksək səviyyəli API təqdim edir. DispatchQueue asılılıqları idarə etmədən sadə async tapşırıqlar üçün aşağı səviyyəli növbədir.

DispatchQueue-da tapşırığı məcburi dayandırmaq mümkündürmü?

GCD işə salınmış tapşırığın dayandırılmasını dəstəkləmir. suspend() metodu yalnız yeni tapşırıqları dayandırır, cari tapşırıq sona qədər icra olunur. Ləğvetmə üçün tapşırıq kodunun daxilində bayrağın əl ilə yoxlanılması lazımdır.

Şəbəkə sorğusu üçün hansı QoS seçilməlidir?

Nəticənin dərhal göstərilməsi ilə əsas sorğu üçün — .userInitiated. Məlumatların əvvəlcədən yüklənməsi üçün — .utility. Fon sinxronizasiyası üçün — .background.

Concurrent növbə neçə ipdən istifadə edir?

GCD iplərin sayını təsbit etmir. İp hovuzu yük altında dinamik olaraq miqyaslanır, prosessor nüvələrini, cari yükü və hər tapşırığın QoS-ni nəzərə alır. Maksimum say sistem tərəfindən məhdudlaşdırılır.

Niyə DispatchQueue.main UIKit üçün məcburidir?

UIKit ip təhlükəsizliyinə malik deyil — onun bütün sinifləri yalnız əsas ipdən çağırılmalıdır. Pozuntu gözlənilməz davranışa, buraxılmış yeniləmələrə və Production-da crash-lərə səbəb olur.

Nəticə

  • DispatchQueue — iOS və macOS-da asinxron tapşırıqlar üçün Grand Central Dispatch-in əsas aləti
  • Serial növbə tapşırıqları ardıcıl icra edir, bloklamalar olmadan yarış vəziyyətini aradan qaldırır
  • Concurrent növbə tapşırıqları sistem ip hovuzu vasitəsilə paralel icra edir
  • QoS tapşırığın prioritetini təyin edir — userInteractive-dən background-a qədər
  • DispatchGroup əsas ipdə notify ilə bir neçə paralel tapşırığı sinxronlaşdırır
  • Deadlock məşğul serial növbədə sync zamanı — diqqət tələb edən kritik səhv
  • Main thread UIKit üçün məcburidir — interfeysi yalnız DispatchQueue.main vasitəsilə yeniləyin

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.

Layihəni müzakirə et

Həm də oxuyun