Iniciar sesión Registro
Anuncios
Tu espacio publicitario
Reserva este slot exclusivo para el periodo elegido.
Comprar publicidad →
Logotipo de la comunidad de telegram - Затишна Галера
Añadido 06 ene. 2025

Затишна Галера

@Zatishna_Galera
Número de suscriptores: 2 709
Fotos: 1,340
Videos: 429
Enlaces: 1,810
Descripción:
Голова Одеського центру розробки DataArt та Delivery Director, капітан Затишної Галери, ділитимуся: завданнями із співбесід (QA/Delivery/Management), статтями, вакансіями, новинами зі світу IT. Контакт: [email protected] ; Patreon: patreon.com/CozyGalley
Fuente

Затишна Галера | iOSКомпас 🧭1️⃣4️⃣9️⃣ Завдання 149Як відмініти Operation?З вами знову т...

Logotipo de la comunidad de telegram - Затишна Галера Затишна Галера @Zatishna_Galera
560 Vistas/Alcance 2026-04-08 07:01 Mensaje №2573
#iOSКомпас 🧭1️⃣4️⃣9️⃣ Завдання 149Як відмініти Operation?З вами знову той самий автор каналу @badlinkschannel. Не забувайте підписатися. А ми продовжуємо наші яблучні історіі.🤔 В Operation (раніше NSOperation) у Foundation є вбудований механізм скасування, який дозволяє коректно завершити операцію, якщо вона більше не потрібна. Однак скасування не перериває виконання автоматично - код усередині операції повинен сам перевіряти прапор скасування і коректно завершуватися.🔣 Як працює скасування Operation?Викликається cancel() - операція позначається як скасована.Прапор isCancelled стає true, але операція продовжує виконуватися, якщо не перевіряє цей прапор.Операція повинна самостійно перевіряти isCancelled і перериватися.class MyOperation: Operation { override func main() { for i in 1...10 { if isCancelled { return } // Перевіряємо, чи скасована операція print("Виконується крок \(i)") sleep(1) // Симуляція роботи } }}let queue = OperationQueue()let operation = MyOperation()queue.addOperation(operation)DispatchQueue.main.asyncAfter(deadline: .now() + 3) { operation.cancel() // Скасовуємо через 3 секунди} 🔣 Скасування асинхронних операційЯкщо операція асинхронна (isAsynchronous = true), просто перевіряти isCancelled недостатньо. Треба коректно керувати станами (isExecuting, isFinished).class AsyncOperation: Operation { private var _executing = false private var _finished = false override var isAsynchronous: Bool { true } override var isExecuting: Bool { get { return _executing } set { willChangeValue(for: \.isExecuting) _executing = newValue didChangeValue(for: \.isExecuting) } } override var isFinished: Bool { get { return _finished } set { willChangeValue(for: \.isFinished) _finished = newValue didChangeValue(for: \.isFinished) } } override func start() { if isCancelled { isFinished = true return } isExecuting = true executeTask() } private func executeTask() { DispatchQueue.global().asyncAfter(deadline: .now() + 3) { if self.isCancelled { self.complete() return } print("Асинхронна операція завершена") self.complete() } } private func complete() { isExecuting = false isFinished = true }}let queue = OperationQueue()let asyncOp = AsyncOperation()queue.addOperation(asyncOp)DispatchQueue.main.asyncAfter(deadline: .now() + 1) { asyncOp.cancel() // Скасовуємо через 1 секунду} 🔣 Скасування залежних операційЯкщо у вас є залежності між операціями, скасування однієї операції не скасовує інші автоматично. Залежні операції просто не почнуть виконуватися, якщо їхня залежність не завершилася коректно.let op1 = MyOperation()let op2 = MyOperation()op2.addDependency(op1)let queue = OperationQueue()queue.addOperations([op1, op2], waitUntilFinished: false)// Скасовуємо першу операціюop1.cancel() @Zatishna_Galera