Sobes.tech
Junior

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

sobes.tech AI

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

GCD (Grand Central Dispatch) — դա Apple-ի ցածր մակարդակի հ paralելության տեխնոլոգիա է, որը կառուցված է C-ի վրա, բայց ունի հարմարավետ շղթաներ Swift և Objective-C-ում: Այն տրամադրում է աշխատանքային հերթերի կառավարման մեխանիզմ (work items) և դրանց ասինխրոն կամ սինխրոն կատարման համար հասանելի պրոցեսորային միջուկների վրա:

Հիմնական գաղափարները GCD-ի:

  1. Dispatch Queues: Աշխատանքի հերթեր։ Կան երկու տեսակ.

    • Serial Queues: Աշխատանքները կատարվում են հերթով։ Օգնում է խուսափել մրցակցության պայմաններից՝ ընդհանուր ռեսուրսների հասանելիության ժամանակ։
    • Concurrent Queues: Աշխատանքները կատարվում են միաժամանակ (բայց նրանց մեկնարկի և ավարտի կարգը չի երաշխավորվում): Օգտագործվում են անկախ աշխատանքների համար, որոնք կարող են կատարվել միաժամանակ։
    • Main Queue: Հատուկ հերթ, կապված հիմնական հոսքի հետ։ Օգտագործվում է UI-ի թարմացման համար։ Բոլոր UI-ի հետ կապված աշխատանքները պետք է կատարվեն հենց այս հերթում։
  2. Work Items (Closures/Blocks): Կոդի բլոկներ, որոնք ներկայացնում են առանձին աշխատանք։

  3. Dispatch Group: Օգնում է միավորել աշխատանքային խմբեր և ստանալ ծանուցում, երբ բոլորը ավարտվեն։

  4. Dispatch Semaphores: Սինխրոնացման primitives, որոնք կառավարում են սահմանափակ ռեսուրսների հասանելիությունը։

Օգտագործում iOS ծրագրավորման մեջ:

  • Խոշոր աշխատանքների կատարմամբ ֆոնային հոսքում: Օրինակ՝ ցանցային հարցումներ, պատկերների մշակում, տվյալների բազաների հետ աշխատում՝ main queue-ից տեղափոխելով ֆոնային հերթեր (օրինակ՝ գլոբալ համաժամանակյա հերթեր), որպեսզի կանխել UI-ի բլոկավորումը։

    // Աշխատանքի կատարման օրինակ գլոբալ համաժամանակյա հերթում
    DispatchQueue.global(qos: .userInitiated).async {
        // Խոշոր աշխատանք
        let result = performHeavyOperation()
    
        // UI-ի թարմացում գլխավոր հոսքում
        DispatchQueue.main.sync {
            updateUI(with: result)
        }
    }
    
  • UI-ի թարմացում: Բոլոր UI-ի փոփոխությունները պետք է կատարվեն main queue-ում։

    // UI-ի թարմացում գլխավոր հոսքում
    DispatchQueue.main.async {
        self.label.text = "Թարմացվել է!"
    }
    
  • Տվյալների մուտքագրման սինխրոնիզացիա: Օգտագործել հատուկ հերթեր՝ սինխրոնացված մուտքագրման համար։

    // Օրինակ՝ սերիական հերթ տվյալների մուտքագրման համար
    let dataAccessQueue = DispatchQueue(label: "com.myapp.dataaccess")
    
    func updateSharedData(newValue: Int) {
        dataAccessQueue.async {
            // Անվտանգորեն փոփոխել ընդհանուր տվյալները
            sharedData = newValue
        }
    }
    
  • Աշխատանքների խմբավորում: Ապահովել միաժամանակ մի քանի ասինխրոն աշխատանքների ավարտը՝ հաջորդ քայլի համար։

    // Աշխատանքների խումբ
    let group = DispatchGroup()
    
    group.enter() // Առաջին աշխատանքը սկսվում է
    performAsyncOperation1 {
        print("Աշխատանք 1 ավարտվեց")
        group.leave()
    }
    
    group.enter() // Երկրորդ աշխատանքը սկսվում է
    performAsyncOperation2 {
        print("Աշխատանք 2 ավարտվեց")
        group.leave()
    }
    
    // Ծանուցում՝ բոլոր աշխատանքները ավարտվեցին
    group.notify(queue: .main) {
        print("Բոլոր աշխատանքները ավարտվեցին, թարմացնում ենք UI")
        // UI-ի թարմացում
    }
    
  • Հետաձգված կատարմամբ: Կոդի կատարման հետաձգում որոշ ժամանակով։

    // Հետաձգում 2 վայրկյան
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        print("Սկսվեց 2 վայրկյան անց")
    }
    

GCD-ն առաջարկում է ավելի բարձր մակարդակի և արդյունավետ մոտեցում հոսքերի կառավարման համար՝ համեմատած ավանդական հոսքերի (օրինակ՝ Thread), փոխանցելով հոսքերի պուլը համակարգին և թույլ տալով արդյունավետ օգտագործել բազմահեղինակ պրոցեսորները։