Aula 52: Fila de Operações e Operações em Swift
Nesta aula, vamos explorar o conceito de Filas de Operações e Operações em Swift. Estas são ferramentas poderosas fornecidas pelo framework Foundation para gerenciar operações concorrentes de forma eficiente e fácil de usar.
O que são Operações?
Operações são instâncias da classe Operation
(ou suas subclasses) que representam uma única tarefa. As operações podem ser executadas de forma concorrente e permitem que você encapsule o código para execução de tarefas, relatórios de progresso e gerenciamento de conclusão.
Criando uma Operação Personalizada
Para criar uma operação personalizada, você pode subclassificar Operation
. Aqui está um exemplo simples:
import Foundation
class CustomOperation: Operation {
var inputData: Int
var outputData: Int?
init(inputData: Int) {
self.inputData = inputData
super.init()
}
override func main() {
if isCancelled {
return
}
// Simular uma tarefa demorada
print("Processando \(inputData)...")
outputData = inputData * 2
if isCancelled {
return
}
print("Processamento concluído de \(inputData) -> \(String(describing: outputData))")
}
}
O que são Filas de Operações?
Uma OperationQueue
é uma fila que executa objetos Operation
. Ela gerencia a execução concorrente das operações, permitindo que você adicione operações e deixe a fila lidar com a execução delas. Você pode definir o número máximo de operações concorrentes, gerenciar dependências entre operações e cancelar operações se necessário.
Usando Fila de Operações
Veja como usar uma fila de operações para executar nossas operações personalizadas:
import Foundation
let operationQueue = OperationQueue()
// Criando instâncias de CustomOperation
let operation1 = CustomOperation(inputData: 1)
let operation2 = CustomOperation(inputData: 2)
let operation3 = CustomOperation(inputData: 3)
// Adicionando operações à fila
operationQueue.addOperations([operation1, operation2, operation3], waitUntilFinished: false)
// Aguardar um pouco para permitir que as operações sejam concluídas
OperationQueue.main.addOperation {
sleep(2)
print("Todas as operações foram concluídas.")
}
Dependências Entre Operações
Uma das características poderosas das operações é a capacidade de definir dependências entre elas. Isso significa que uma operação pode esperar que outra seja concluída antes de começar a execução.
Adicionando Dependências
Vamos modificar nosso exemplo para fazer com que operation3
dependa de operation2
:
import Foundation
let operationQueue = OperationQueue()
let operation1 = CustomOperation(inputData: 1)
let operation2 = CustomOperation(inputData: 2)
let operation3 = CustomOperation(inputData: 3)
// Definindo dependência
operation3.addDependency(operation2)
// Adicionando operações à fila
operationQueue.addOperations([operation1, operation2, operation3], waitUntilFinished: false)
OperationQueue.main.addOperation {
sleep(2)
print("Todas as operações foram concluídas.")
}
Neste exemplo, operation3
não começará até que operation2
tenha sido concluída.
Cancelando Operações
Você também pode cancelar operações se elas não forem mais necessárias. Veja como fazer isso:
import Foundation
let operationQueue = OperationQueue()
let operation1 = CustomOperation(inputData: 1)
let operation2 = CustomOperation(inputData: 2)
// Adicionando operações à fila
operationQueue.addOperations([operation1, operation2], waitUntilFinished: false)
// Cancelando a primeira operação
operation1.cancel()
OperationQueue.main.addOperation {
sleep(2)
print("Todas as operações foram concluídas.")
}
Nesse caso, operation1
não executará sua tarefa, pois foi cancelada.
Conclusão
Nesta aula, abordamos o básico sobre Filas de Operações e Operações em Swift. Aprendemos como criar operações personalizadas, gerenciar dependências entre elas e como executá-las usando uma fila de operações. Este conhecimento pode aumentar significativamente sua capacidade de lidar com tarefas concorrentes em suas aplicações, tornando-as mais eficientes e responsivas.
Sinta-se à vontade para experimentar esses conceitos para entender melhor como você pode aproveitar as filas de operações e operações em seus próprios projetos!