Sobes.tech
Middle

Kako implementirati višestruko pokretanje koristeći redove?

sobes.tech АИ

Одговор од АИ

За реализовање мултитаскинга у iOS користе се технологије као што су GCD (Grand Central Dispatch) или Operation Queues.

GCD (Grand Central Dispatch)

GCD је нискоуровнички C API за управљање паралелним задацима коришћењем редова за дистрибуцију.

Основне концепције GCD:

  • Редови за дистрибуцију (Dispatch Queues): Структуре података које управљају извршавањем блокова кода (задатака). Могу бити последовни (serial) или паралелни (concurrent).
  • Глобални паралелни редови (Global Concurrent Queues): Системски редови, доступни по подразумевану, са различитим приоритетима (qos - Quality of Service).
  • Главни ред (Main Queue): Ово је последовни ред повезан са главним UI током. Користи се за ажурирање корисничког интерфејса.

Пример коришћења GCD:

import Foundation

// Добијање глобалног паралелног реда са високим приоритетом
let globalQueue = DispatchQueue.global(qos: .userInitiated)

// Добијање главног реда
let mainQueue = DispatchQueue.main

// Асинхроно извршавање задатка у глобалном реду
globalQueue.async {
    // Извршавање дуготрајног задатка...
    print("Извршава се у фоновом току")

    // Прелазак на главни ред за ажурирање UI (ако је потребно)
    mainQueue.async {
        // Ажурирање UI...
        print("Ажурирање UI у главном току")
    }
}

// Креирање и коришћење корисничког последовног реда
let serialQueue = DispatchQueue(label: "com.example.mySerialQueue")

serialQueue.async {
    print("Задача 1 у последовном реду")
}

serialQueue.async {
    print("Задача 2 у последовном реду") // Извршиће се након Задаће 1
}

Operation Queues

Operation Queues су високоуровна апстракција над GCD, заснована на објектима Operation.

Основне концепције Operation Queues:

  • Операције (Operation): Објекти који представљају јединицу посла. Могу бити подкласови Operation (нпр. BlockOperation, URLSessionDownloadTask). Подржавају зависности између операција.
  • Редови операција (OperationQueue): Објекат који управља извршавањем Operation. Могу бити конфигурисани за ограничење максималног броја истовремено извршаваних операција (maxConcurrentOperationCount).

Пример коришћења Operation Queues:

import Foundation

// Креирање реда операција
let operationQueue = OperationQueue()

// По жељи: ограничити број истовремених операција
operationQueue.maxConcurrentOperationCount = 3

// Креирање операције
let operation1 = BlockOperation {
    print("Операција 1 се извршава")
    // Извршавање задатка...
}

let operation2 = BlockOperation {
    print("Операција 2 се извршава")
    // Извршавање задатка...
}

// Креирање операције са блоком (алтернативни начин)
let operation3 = BlockOperation {
    print("Операција 3 се извршава")
    // Извршавање задатка...
}

// Додавање завршног блока (completion block)
operation3.completionBlock = {
    print("Операција 3 је завршена")
}

// Додавање зависности (Операција 2 ће се извршити након Операције 1)
operation2.addDependency(operation1)

// Додавање операција у ред
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)

// Операције ће почети да се извршавају асинхроно у зависности од доступних нити и зависности

Поређење GCD и Operation Queues:

Карактеристика GCD (Grand Central Dispatch) Operation Queues
Ниво апстракције Ниско (C API) Високо (Objective-C/Swift класе)
Управљање задацима Блокови или функције Објекти Operation
Зависности Захтева ручно управљање (нпр. DispatchGroup) Уграђена подршка преко addDependency
Отказивање Тешко Лако (преко метода cancel() за операцију)
Стање Нема јасно стање Подржава стања (спремно, извршава се, завршено)
Надгледање Захтева ручну имплементацију Подршка преко KVO (Key-Value Observing)
Тежина имплементације Боље за једноставне, неотказиве задатке Боље за сложене, зависне, отказиве задатке

Избор између GCD и Operation Queues зависи од специфике задатка. GCD је лакши и погодан за једноставне позадинске задатке. Operation Queues пружају већу флексибилност у управљању, подршку за зависности и отказивање, што их чини пожељним за сложеније сценарије управљања задацима.