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 — 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.
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 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.
| Parametr | Serial növbə | Concurrent növbə |
|---|---|---|
| İcra ardıcıllığı | Ciddi ardıcıl | Paralel |
| İp sayı | Bir | GCD hovuzundan bir neçə |
| Tətbiq | Paylaşılan resursların qorunması | Müstəqil hesablamalar |
| Main queue | Bəli (əsas ip) | Xeyr |
| Deadlock riski | Eyni növbədə sync zamanı yüksək | Aşağı |
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ə 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.
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.
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 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.
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 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.
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.
let queue = DispatchQueue.global(qos: .userInitiated)
queue.async {
let data = self.fetchData()
DispatchQueue.main.async {
self.updateUI(with: data)
}
}
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.
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)")
}
}
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.
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()
}
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.
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.
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.
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
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.
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.
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.
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.
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ə
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.
Həm də oxuyun