No Swift, os fechamentos são sem escape por padrão.
Um fechamento sem escape é chamado imediatamente na função para a qual é passado. A vida desse fechamento termina quando a chamada de função é concluída. Como resultado, nunca mais haverá vestígios desse fechamento.
Mas esse comportamento padrão de um fechamento pode ser um problema quando você está executando um código assíncrono. Isso é melhor demonstrado por um exemplo muito simples. Então, vamos direto ao assunto.
Digamos que você esteja trocando mensagens com seu amigo e pergunte “Como vai você?”. Como você sabe, seu amigo demora um pouco para responder. Digamos que leva 2 segundos, por exemplo.
Agora você quer simular essa conversa amigável no Swift.
Você precisa de uma função que receba um fechamento do manipulador de resposta como parâmetro. Este manipulador de resposta é simplesmente responsável por imprimir a resposta do seu amigo que chega 2 segundos depois:
func howAreYou(_ responseHandler: (String) -> Void) {
print("Hey, how are you?") // you ask how are you
// Simulating how it takes 2 seconds for your friend to answer:
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
responseHandler("Hi, I'm doing really good.")
})
print("Responding takes a while...")
}
howAreYou({ friendResponse in
print(friendResponse)
})
Isso significa que o responseHandlerseria destruído antes que a resposta do seu amigo chegasse.
Portanto, o problema é que responseHandlerele nunca teria a chance de lidar com a resposta do seu amigo porque seria destruído antes que a resposta 'chegasse'.
Agora você pode se perguntar se há uma maneira de terminar a execução desta função, mas manter o responseHandlervivo de alguma forma para que seja capaz de lidar com a resposta... Bem, é exatamente isso que os @escapingencerramentos fazem.
Agora, para usar um fechamento de escape, basta marcar o responseHandlerfechamento @escaping da seguinte forma:
func howAreYou(_ responseHandler: @escaping (String) -> Void) {
print("Hey, how are you?") // you ask how are you
// It takes 2 seconds for your friend to answer:
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
responseHandler("Hi, I'm doing really good.")
})
print("Responding takes a while...")
}
howAreYou({ friendResponse in
print(friendResponse)
})
É tão simples quanto isso! Agora seu responseHandlerfechamento é capaz de mostrar a resposta do seu amigo, pois pode sobreviver ao howAreYouescopo da função!
Os fechamentos de escape são úteis sempre que você deseja que o fechamento seja capaz de viver fora do escopo da função de onde você o está chamando.
Por exemplo, ao lidar com solicitações de rede, por exemplo, ao buscar alguns dados de um servidor, levará algum tempo para que a solicitação de rede seja concluída e a resposta chegue.
Se você quiser executar algumas ações com a resposta da rede, precisará de um encerramento de escape para fazer o manipulador de resposta viver fora da chamada de função de solicitação para manipular a resposta, por exemplo, 2 segundos depois.
Espero que você ache útil. Dê palmas para que outros também o encontrem!
Certifique-se de me seguir no Medium para não perder nada. Além disso, vamos ser amigos no Linkedin .
Passo 1 Conserte seu intestino. O youtube abaixo tem bons conselhos.
É uma manhã brilhantemente dourada nas colinas do oeste, enquanto os primeiros raios de sol iluminam a grama congelada nas planícies. Um rebanho de gado Angus plácido, preto e maciço, é recortado contra o nascer do sol enquanto segue por uma trilha batida até um local que todos conhecem bem; a barra de café da manhã.
Olá, entusiastas cibernéticos! Bem-vindo de volta ao OSINT para a série de caça a ameaças. No primeiro artigo, apresentei uma visão geral do OSINT e sua importância na caça às ameaças.
Introdução:Bem-vindos, corajosos leitores, a uma jornada que nos levará às profundezas mais sombrias do nosso planeta. Neste blog, mergulhamos no mundo enigmático da Fossa das Marianas, revelando seus segredos ocultos e revelando as verdades arrepiantes que se escondem sob sua superfície.