Middle
Кадом беҳтар аст: NSOperationQueue ё GCD?
sobes.tech AI
Ҷавоб аз AI
Интихоб байни NSOperationQueue ва GCD вобаста ба талаботи мушаххасии вазифа мебошад.
GCD (Grand Central Dispatch) - API пасти сатҳ барои барномасозии параллелӣ, ки дар асоси консепсияи наворҳо сохта шудааст.
NSOperationQueue - API сатҳи баланд Objective-C/Swift, ки дар болои GCD сохта шудааст. Он имкониятҳои иловагӣ медиҳад.
Фарқиятҳои асосӣ:
| Хусусият | GCD | NSOperationQueue |
|---|---|---|
| Сатҳи API | Пасти сатҳ | Баланди сатҳ |
| Навъи вазифа | Блокҳо (closures дар Swift) | objects Operation |
| Вобастагиҳо | Дастгирӣ намекунад | Дастгирӣ барои вобастагиҳо байни операцияҳо |
| Приоритет | Дастгирӣ мекунад | Дастгирӣ мекунад, бо имконияти тағир додан |
| Бекор кардани вазифа | Гуногун иҷро кардан мушкил аст | Ба осонӣ тавассути cancel() иҷро кардан |
| Мониторинг | Дар дохил нест | Хусусиятҳо барои мониторинг (isExecuting, isFinished) |
| Максимум шумораи параллелӣ | Назорати мустақим нест | Мумкин аст maxConcurrentOperationCount танзим кардан |
| Наследият | Ба блокҳо татбиқ намешавад | Мумкин аст барои сохтани вазифаҳои фармоишӣ наследӣ кардан |
Вақте ки истифодаи GCD лозим аст:
- Вақте ки ба иҷрои максималӣ ва камхарҷӣ ниёз доред.
- Барои вазифаҳои оддӣ дар пасзамина, ки логикаи мураккаб ё вобастагиҳо талаб намекунад.
- Вақте ки бо API пасти сатҳ кор мекунед.
Масалан, барои иҷрои вазифаи кӯтоҳ CPU-bound дар пасзамина:
// DispatchQueue.global(qos: .userInitiated) - навор умумӣ бо афзалият муайяншуда.
// async - иҷрои асинхронӣ.
DispatchQueue.global(qos: .userInitiated).async {
// иҷрои вазифаи гарон
let result = self.performExpensiveCalculation()
// гузаштан ба навори асосӣ барои навсозии UI
DispatchQueue.main.async {
self.updateUI(with: result)
}
}
Вақте ки истифодаи NSOperationQueue:
- Вақте ки вазифаҳо вобастагӣ доранд ва бояд дар тартиби муайян иҷро шаванд.
- Вақте ки мехоҳед вазифаҳоро ба осонӣ бекор кунед ё ҳолати онҳоро назорат кунед.
- Вақте ки назорати шумораи максимумии вазифаҳои ҳамзамон иҷрошавандаро лозим аст.
- Барои вазифаҳои мураккаб ё дарозмуддат.
- Вақте ки лозим аст, воҳидҳои кории такроршаванда ва капсулидашударо созед (
Operation).
Масалан бо вобастагӣ:
import Foundation
// Воҳиди корӣ барои боргирии маълумот
let downloadOperation = BlockOperation {
print("Боргирии маълумот...")
Thread.sleep(forTimeInterval: 2) // Имитацияи таъхир
print("Маълумот боргирӣ шуд.")
}
// Воҳиди корӣ барои коркарди маълумот, вобаста ба боргирӣ
let processOperation = BlockOperation {
print("Коркарди маълумот...")
Thread.sleep(forTimeInterval: 1) // Имитацияи таъхир
print("Маълумот коркард шуд.")
}
// Илова кардани вобастагӣ: processOperation интизор аст, то downloadOperation анҷом ёбад
processOperation.addDependency(downloadOperation)
// Сохтани навори вазифаҳо
let operationQueue = OperationQueue()
// Илова кардани вазифаҳо ба навор
operationQueue.addOperation(downloadOperation)
operationQueue.addOperation(processOperation)
// Интизорӣ барои анҷоми ҳамаи вазифаҳо (барои намоиш, дар барномаҳои воқеӣ одатан намешавад)
operationQueue.waitUntilAllOperationsAreFinished()
print("Ҳамаи вазифаҳо анҷом ёфт.")
Хулоса:
- Барои вазифаҳои оддӣ, мустақил ва бо иҷрои максималӣ, GCD бештар интихоб мешавад.
- Барои сценарияҳои мураккаб бо вобастагиҳо, бекор кардан ва мониторинг, NSOperationQueue беҳтар аст.
NSOperationQueue қабати абстраксия ва функсионалӣ дар болои GCD илова мекунад, ки барои баъзе вазифаҳо қулайтар аст, аммо бо хароҷоти камтар. Дар аксар ҳолатҳо, агар имкониятҳои иловагӣ заруранд, интихоби хуб аст.