Middle
պատմեք iOS-ում բազմատող ծրագրավորման գլոբալ հերթի մասին։
sobes.tech AI
Պատասխան AI-ից
Գլոբալ հերթ (Global Queue)՝ Grand Central Dispatch (GCD)-ում՝ դա նախանշված համակարգային հերթեր են, որոնք հասանելի են բոլոր հավելվածների համար: Դրանք համատեղ հերթեր են, այսինքն՝ դրանցում առաջադրանքները կարող են կատարվել միաժամանակ տարբեր հոսքերում:
Հիմնական հատկանիշներ՝
- Տիպեր: Տարբերում են սպասարկման որակի մակարդակով (QoS - Quality of Service):
- QoS: Կարգավորում է առաջադրանքների կատարման առաջնահերթությունը, ազդում է այն վրա, թե որ առաջադրանքները պետք է կատարվեն արագ:
- Համաժամանակություն: Позволяет выполнять множество задач одновременно.
- Համակարգային: Ստեղծվում և կառավարվում է օպերացիոն համակարգի կողմից:
Տարբեր տեսակների գլոբալ հերթեր (առաջնահերթության նվազման կարգով):
| QoS մակարդակ | Նկարագրություն |
|---|---|
userInteractive |
Առաջադրանքներ, որոնք անմիջապես ազդում են օգտվողի ինտերֆեյսի վրա (անիմացիաներ, իրադարձություններ): |
userInitiated |
Առաջադրանքներ, որոնք սկսում է օգտվողը, բայց չեն խոչընդոտում UI-ին (միայն բովանդակության բեռնում): |
default |
Անհատական մակարդակ առանց QoS հստակեցնելու: |
utility |
Առաջադրանքներ, որոնք պահանջում են կատարման ժամանակ, բայց չեն անհապաղ անհրաժեշտ UI-ին (մեծ ֆայլերի բեռնում): |
background |
Առաջադրանքներ, որոնք կատարվում են ֆոնային ռեժիմում, չեն տեսանելի օգտվողին (մասնակցություն տվյալների սինխրոնիզացիային): |
unspecified |
Կիրառվում է հազվադեպ, երբ QoS-ը կարևոր չէ: Թվայնորեն համարժեք է default-ին: |
Աջակցություն գլոբալ հերթերին:
// Գլոբալ հերթ ստանալ նշված QoS մակարդակով
let userInitiatedQueue = DispatchQueue.global(qos: .userInitiated)
// Դեպի ստանդարտ գլոբալ հերթ
let defaultQueue = DispatchQueue.global()
Գլոբալ հերթերի օգտագործում առաջադրանքների կատարման համար:
// Ասինխրոն կատարման օրինակ ֆոնային հերթում
DispatchQueue.global(qos: .background).async {
// Լայնածավալ կոդ, որը չի խոչընդոտում UI-ին
}
// Սինխրոն կատարման օրինակ (քիչ օգտագործվում է գլոբալ հերթերի դեպքում)
DispatchQueue.global(qos: .userInitiated).sync {
// Կոդ, որը պետք է կատարվի առաջ, քան ընթացիկ հոսքը շարունակվի
}
Կարևոր է հիշել՝
- Չպետք է կատարել այն առաջադրանքները, որոնք անմիջապես ազդում են UI-ի վրա, գլոբալ հերթերում (բացառությամբ
userInteractive-ի՝ շատ արագ գործողությունների համար): UI-ի թարմացումները կատարեք հիմնական հերթում (DispatchQueue.main). - Գլոբալ հերթերը նախատեսված են միաժամանակյա կատարման համար: Արդյունքների հերթականությունը չի երաշխավորվում:
sync-ի օգտագործման դեպքում ընթացիկ հոսքը կլոկավորվի մինչև առաջադրանքի ավարտը, ինչը կարող է հանգեցնել UI-ի բլոկավորման, եթե կանչվում է հիմնական հոսքից։