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нин кемчиликтери:

  • Кээде көбүрөөк ийкемдүү эмес, ручной башкаруу менен салыстырганда, айрым татаал сценарийлерде:
  • Көп агымдуу кодду дебагдоо кыйын болушу мүмкүн.