Sobes.tech
Middle

Ինչ կարող եք ասել Grand Central Dispatch-ի մասին և դրա օգտագործման մասին iOS զարգացման մեջ?

sobes.tech AI

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

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

Հիմնական բաղադրիչները:

  • Հոսքերի հերթեր (Dispatch Queues): Տվյալների կառուցվածքներ, որոնք պահում են առաջադրանքների բլոկներ (workItem) կատարման համար: Առաջադրանքները կատարվում են ավելացման կարգով:

    • Կատարողական հերթեր (Serial Queues): Կատարում են առաջադրանքները մեկ մեկ, ավելացման կարգով: Գոյություն ունեն կատարողական և տվյալների անվտանգություն, որոնք փոփոխվում են միայն մեկ հերթում:
    • Համաժամանակյա հերթեր (Concurrent Queues): Կատարում են առաջադրանքները միաժամանակ, օգտագործելով հասանելի համակարգային ռեսուրսները: Կատարողական ավարտի կարգը չի երաշխավորվում:
      • Գլոբալ համաժամանակյա հերթեր (Global Concurrent Queues): Տրամադրվում են համակարգի կողմից տարբեր առաջնահերթություններով (qos): .userInteractive, .userInitiated, .default, .utility, .background:
    • Հիմնական հերթ (Main Queue): Հատուկ հերթ, կապված ծրագրի հիմնական հոսքի հետ (main thread): Օգտագործվում է UI-ի թարմացման համար:
  • Աշխատանքային բլոկներ (Work Items): Կլոզուրներ կամ ֆունկցիաներ, որոնք GCD-ն ուղարկում է կատարման:

  • Հոսքերի խմբեր (Dispatch Groups): Позволяют выполнять задачи на нескольких очередях и получать уведомление по завершении всех задач в группе:

  • Հոսքերի սեմապորներ (Dispatch Semaphores): Մեխանիզմ՝ սահմանափակելու հոսքերի քանակը, որոնք միաժամանակ դիմում են ռեսուրսին, կամ սինխրոնիզացիայի համար հոսքերի միջև:

Օգտագործում iOS-կառավարում:

  • Ասինխրոնային առաջադրանքների կատարմամբ: Տեղափոխում է ռեսուրսային ծանր օպերացիաները (միջանցքային հարցումներ, տվյալների բազայի աշխատանք, պատկերների մշակումը) հիմնական հոսքից՝ աջակցելու UI-ի արձագանքմանը:
    let queue = DispatchQueue.global(qos: .userInitiated)
    queue.async {
        // Ռեսուրսային ծանր օպերացիայի կատարում
        let result = performHeavyCalculation()
    
        DispatchQueue.main.async {
            // UI-ի թարմացում հիմնական հոսքում
            self.updateUI(with: result)
        }
    }
    
  • Սինխրոնիզացիա:
    • Սեմապորներ՝ բաժանված ռեսուրսների մուտքը սահմանափակելու համար:
      let semaphore = DispatchSemaphore(value: 1) // թույլ է տալիս 1 հոսքին մուտք ունենալ
      semaphore.wait() // սպասում է, մինչև սեմապորը հասանելի լինի
      // Բաժանվող ռեսուրսի մուտք
      semaphore.signal() // ազատում է սեմապորը
      
    • Կատարողական հերթեր՝ տվյալների անվտանգությունը ապահովելու համար:
  • Խմբային առաջադրանքների կատարմամբ: Միաժամանակյա առաջադրանքների կատարում և սպասում դրանց ավարտին:
    let group = DispatchGroup()
    let concurrentQueue = DispatchQueue.global()
    
    group.enter() // մուտք խմբի
    concurrentQueue.async {
        // Առաջադրանք 1
        print("Առաջադրանք 1 ավարտված")
        group.leave() // դուրս գալ խմբից
    }
    
    group.enter()
    concurrentQueue.async {
        // Առաջադրանք 2
        print("Առաջադրանք 2 ավարտված")
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Բոլոր առաջադրանքները խմբում ավարտված
        print("Բոլոր առաջադրանքները ավարտված")
    }
    
  • Հետաձգված կատարմամբ: Կոդի կատարում որոշ ժամանակ անց:
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Կոդը կիրականացվի 2 վայրկյանի ընթացքում
        print("Հետաձգված կատարմամբ")
    }
    

GCD-ի առավելությունները:

  • Օգտագործման պարզություն՝ համեմատած հոսքերի ձեռքով կառավարման:
  • Համակարգային կառավարման հոսքերի պուլ՝ օպտիմիզացված բազմահեղինակային պրոցեսորների համար:
  • Էֆեկտիվ ռեսուրսների օգտագործում:
  • Խուսափում է հոսքերի ձեռքով կառավարման հետ կապված խնդիրներից (պայքարային վիճակներ, взаимоблокировки):

GCD-ի թերությունները:

  • Ավելի քիչ ճկուն է, քան հոսքերի ձեռքով կառավարումը որոշ բարդ սցենարներում:
  • Մուլտիթրեդային կոդի դեբագը կարող է լինել բարդ: