Sobes.tech
Middle

Ի՞նչ է Grand Central Dispatch-ը և ինչպես է այն օգտագործվում iOS զարգացման մեջ։

sobes.tech AI

Պատասխան AI-ից

Grand Central Dispatch (GCD) — ցածր մակարդակի API՝ բազմատողային կառավարման համար, որը ապահովում է համակարգային թելերի պուլ և պլանավորում է դրանց վրա առաջադրանքների կատարմանը:

GCD-ի հիմնական գաղափարները՝

  • Dispatch Queues: Քաշեր, որոնց մեջ տեղադրվում են կոդի բլոկներ (գործառույթներ) կատարման համար:
    • Serial Queues: Կատարում են բլոկները հերթականությամբ՝ մեկից հետո մեկ:
    • Concurrent Queues: Կատարում են բլոկները միաժամանակ, բայց ըստ ավելացման կարգի:
  • Tasks (Blocks): Աշխատանքային միավորներ, որոնք ուղարկվում են Dispatch Queues:
  • Dispatch Sources: Սիստեմային իրադարձությունների մոնիտորինգ՝ ֆայլեր, socket-ներ, նշաններ, որոնք հրավիրում են բլոկների կատարմանը դրանց առաջացման ժամանակ:

Օգտագործում՝

  1. Ֆոնային գործողությունների կատարման: Դատան տվյալների բեռնում ցանցից, պատկերների մշակում, բարդ հաշվարկներ՝ առանց գլխավոր թելին (UI) խանգարելու:

    DispatchQueue.global(qos: .userInitiated).async {
        // Ծանրաբեռնված գործողության կատարում
        let processedData = performHeavyProcessing()
    
        DispatchQueue.main.async {
            // UI-ի թարմացում գլխավոր թելին
            updateUI(with: processedData)
        }
    }
    
  2. Գործառույթների պլանավորում: Ուղարկում հետաձգված կամ պարբերական կատարման:

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Այս կոդը կիրականացվի 2 վայրկյան հետո
        print("Հետաձգված կատարում")
    }
    
  3. Տվյալների մուտքի սինխրոնիզացիա: Սերիական հերթերի կամ DispatchQueue.concurrentPerform օգտագործում՝ միաժամանակյա մուտքի վերահսկման համար:

    let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent)
    var sharedArray = [Int]()
    
    func addItem(_ item: Int) {
        syncQueue.async(flags: .barrier) { // .barrier օգտագործում՝ բացառիկ մուտքագրում գրելու ժամանակ
            sharedArray.append(item)
        }
    }
    
    func processItems() {
        syncQueue.sync { // սինխրոն ընթերցում
            for item in sharedArray {
                print(item)
            }
        }
    }
    

Առավելություններ՝ POSIX թելերի (մատչելի թելերի) նկատմամբ՝

  • Հեշտ օգտագործում: Բարձր մակարդակի աբստրակցիա:
  • Արդյունավետություն: GCD-ը ավելի արդյունավետ է կառավարում համակարգային թելերի պուլը՝ նվազեցնելով ծախսերը:
  • Մասշտաբայնություն: Ավտոմատ կերպով հարմարեցվում է պրոցեսորի միջուկների քանակին:

QoS տեսակներ (Որակյալ ծառայություն): Կարգավորում է GCD-ի պլանավորողի առաջադրանքի առաջնահերթությունը:

QoS Օգտագործում
userInteractive UI-ի թարմացումներ, անիմացիաներ, արագ արձագանք
userInitiated Օգտագործողի կողմից սկսված առաջադրանքներ, որոնք պահանջում են արագ ավարտում (բեռնում, լուսանկարների մշակում)
default Դյուրակիր առաջնահերթություն, միջեւ userInitiated և utility
utility Երկարատև առաջադրանքներ՝ առանց շտապության (բեռնում, ինդեքսավորում)
background Պատկերացումներ՝ ֆոնային առաջադրանքներ, որոնք չեն տեսանելի օգտատիրոջը (գրառումներ, սինխրոնիզացիա ֆոնում)
unspecified Առաջադրանքի առաջնահերթությունը չի սահմանվել, որոշվում է համակարգի կողմից