Ինչպե՞ս իրականացնել բազմապատկման գործառույթը օգտագործելով հերթեր։
sobes.tech AI
Պատասխան AI-ից
ԻՕՍ-ի մեջ բազմաբնույթ աշխատանքների իրականացման համար օգտագործվում են GCD (Grand Central Dispatch) կամ Operation Queues տեխնոլոգիաները:
GCD (Grand Central Dispatch)
GCD — դա ցածր մակարդակի C API է, որը օգտագործվում է հոսքերի կառավարման համար՝ օգտագործելով հանձնարարականների հերթերը:
Հիմնական գաղափարները GCD-ի:
- Հանձնարարականների հերթեր (
Dispatch Queues): Դատարկված տվյալների կառուցվածքներ, որոնք կառավարում են կոդի բլոկների (աշխատանքների) կատարմանը։ Կարող են լինել հերթական (serial) կամ համաժամանակյա (concurrent)։ - Համաշխարհային համաժամանակյա հերթեր (
Global Concurrent Queues): Սիստեմային հերթեր, որոնք հասանելի են ըստ պահանջի, տարբեր առաջնահերթություններով (qos - Quality of Service)։ - Հիմնական հերթ (
Main Queue): Սա հերթ է, որը կապված է հիմնական UI հոսքի հետ։ Օգտագործվում է օգտվողի ինտերֆեյսի թարմացման համար։
GCD-ի օգտագործման օրինակ:
import Foundation
// Վերցնել բարձր առաջնահերթությամբ համաշխարհային հերթ
let globalQueue = DispatchQueue.global(qos: .userInitiated)
// Վերցնել գլխավոր հերթ
let mainQueue = DispatchQueue.main
// Ասինխրոն աշխատանք կատարում համաշխարհային հերթում
globalQueue.async {
// Դլատարատև աշխատանք...
print("Կատարվում է ֆոնային հոսքում")
// Գնալ գլխավոր հերթ՝ UI թարմացման համար (եթե անհրաժեշտ է)
mainQueue.async {
// Թարմացնել UI...
print("UI-ի թարմացում գլխավոր հոսքում")
}
}
// Ստեղծել և օգտագործել օգտագործողի հերթը
let serialQueue = DispatchQueue(label: "com.example.mySerialQueue")
serialQueue.async {
print("Առաջին աշխատանքը հերթական հոսքում")
}
serialQueue.async {
print("Երկրորդ աշխատանքը հերթական հոսքում") // Կատարվելու է առաջինից հետո
}
Operation Queues
Operation Queues — դա բարձր մակարդակի abstraction է GCD-ի վրա, հիմնված Operation օբյեկտների վրա:
Հիմնական գաղափարները Operation Queues-ի:
- Աշխատանքներ (
Operation): Օբյեկտներ, որոնք ներկայացնում են աշխատանքային միավոր։ Կարող են լինելOperation-ի ենթակլասներ (օրինակ,BlockOperation,URLSessionDownloadTask)։ Պատրաստում են կախվածություններ աշխատանքների միջև։ - Աշխատանքների հերթեր (
OperationQueue): Օբյեկտ, որը կառավարում էOperation-ների կատարմանը։ Կարող է սահմանել առավելագույն միաժամանակ կատարվող աշխատանքների քանակը (maxConcurrentOperationCount)։
Օրինակ՝ Operation Queues-ի օգտագործումը:
import Foundation
// Ստեղծել աշխատանքների հերթ
let operationQueue = OperationQueue()
// Ընտրովի՝ սահմանել առավելագույն միաժամանակ կատարվող աշխատանքների քանակը
operationQueue.maxConcurrentOperationCount = 3
// Ստեղծել աշխատանք
let operation1 = BlockOperation {
print("Աշխատանք 1 կատարվում է")
// Աշխատանքի կատարման կոդ...
}
let operation2 = BlockOperation {
print("Աշխատանք 2 կատարվում է")
// Աշխատանքի կատարման կոդ...
}
// Ստեղծել աշխատանք՝ բլոկով (այլընտրանքային մեթոդ)
let operation3 = BlockOperation {
print("Աշխատանք 3 կատարվում է")
// Աշխատանքի կատարման կոդ...
}
// Ավելացնել ավարտական բլոկ
operation3.completionBlock = {
print("Աշխատանք 3 ավարտվեց")
}
// Ավելացնել կախվածություններ (Աշխատանք 2 կատարվելու է հետո Աշխատանք 1-ի)
operation2.addDependency(operation1)
// Ավելացնել աշխատանքները հերթին
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)
// Աշխատանքները սկսելու են կատարվել ասինխրոն՝ կախված հասանելի թրեդներից և կախվածություններից
GCD և Operation Queues համեմատություն:
| Գծագրություն | GCD (Grand Central Dispatch) | Operation Queues |
|---|---|---|
| Աբստրակցիայի մակարդակ | Նվազ (C API) | Բարձր (Objective-C/Swift դասեր) |
| Թվարկում աշխատանքների կառավարում | Բլոկներ կամ ֆունկցիաներ | Operation օբյեկտներ |
| Կախվածություններ | Պահանջում են ձեռքով կառավարում (օրինակ, DispatchGroup) |
Ներդրված աջակցություն addDependency-ով |
| Չեղարկում | Կարծես թե դժվար | Հեշտ (մեթոդով cancel() աշխատանքը) |
| Կարգավիճակ | Չկա հստակ կարգավիճակ | Պահպանում է կարգավիճակներ (պատրաստ, կատարվում, ավարտված) |
| Դիտարկում | Պահանջում է ձեռքով իրականացնել | KVO (Key-Value Observing) աջակցություն |
| Կարծրություն | Ավելի լավ է հարմար է պարզ, չեղարկվող աշխատանքների համար | Ավելի լավ է հարմար է բարդ, կախված, չեղարկվող աշխատանքների համար |
Ընտրությունը GCD և Operation Queues միջև կախված է խնդրի բնույթից։ GCD ավելի թեթև է և հարմար է պարզ ֆոնային աշխատանքների համար։ Operation Queues առաջարկում են ավելի մեծ ճկունություն, կախվածությունների և չեղարկման աջակցություն, ինչը նրանց դարձնում է նախընտրելի ավելի բարդ աշխատանքային կառավարման համար։