Sobes.tech
Junior

Šta je GCD (Grand Central Dispatch) i kako se koristi u razvoju iOS?

sobes.tech АИ

Одговор од АИ

GCD (Grand Central Dispatch) је технологија ниског нивоа за паралелност од Apple, изграђена на 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: Примитив за синхронизацију за управљање приступом ограниченом броју ресурса.

Користи у развоју за iOS:

  • Извршавање тешких операција у позадини: Пренос задатака као што су мрежни захтеви, обрада слика, рад са базама података, са главне реда на позадинске редове (нпр. глобалне конкуретне редове) како би се спречило блокирање UI.

    // Асинхроно извршавање задатка у глобалној паралелној реду
    DispatchQueue.global(qos: .userInitiated).async {
        // Тешка операција
        let result = performHeavyOperation()
    
        // Ажурирање UI на главном треду
        DispatchQueue.main.sync {
            updateUI(with: result)
        }
    }
    
  • Ажурирање UI: Увек извршавати операције промене корисничког интерфејса на главном реду.

    // Ажурирање 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() // Почетак задатка 1
    performAsyncOperation1 {
        print("Задача 1 завршена")
        group.leave()
    }
    
    group.enter() // Почетак задатка 2
    performAsyncOperation2 {
        print("Задача 2 завршена")
        group.leave()
    }
    
    // Обавештење након завршетка свих задатака у групи
    group.notify(queue: .main) {
        print("Сви задаци су завршени, ажурирање UI")
        // Ажурирање UI
    }
    
  • Одложено извршавање: Извршавање кода након одређеног временског периода.

    // Одложено извршавање након 2 секунде
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        print("Покренуто након 2 секунде")
    }
    

ГЦД пружа виши ниво и ефикаснији приступ управљању нитима у поређењу са традиционалним нитима (нпр. Thread), препуштајући управљање пулом нити систему и омогућавајући ефикасно коришћење мулти-језгарних процесора.