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 пружају већу флексибилност у управљању, подршку за зависности и отказивање, што их чини пожељним за сложеније сценарије управљања задацима.