[Swift] Escaping Closure
Escaping Closure
(μ΄μ€μΌμ΄ν ν΄λ‘μ )
μ΄μ€μΌμ΄ν ν΄λ‘μ λ
ν΄λ‘μ κ° ν¨μ μΈμλ‘ μ λ¬λμ λ, ν¨μμ μ€νμ΄ μ’
λ£λ νμ μ€νλλ ν¨μμμ!
(μμ.. ν΄λ‘μ λ μ΄λ €μ΄λ°, μ΄μ€μΌμ΄ν ν΄λ‘μ λ λ λͺ¨μΌ??π‘
μΆμμ΅λλ€..ννν)
κ·Έλ¦¬κ³ λ°λλ‘ Non-escaping Closureλ μμ΄μ.
μ΄λ
μμ ν¨μκ° μ’
λ£λκΈ° μ μ μ€νλλ ν΄λ‘μ μ
λλ€!
μ΄μ μ°¨κ·Όμ°¨κ·Ό μμλ₯Ό λ€μ΄ μ 리ν΄λ³Όκ²μ!!
func escapingClosureEX(completion: () -> Void) {
completion()
}
μ΄μ μ΄λ° ννλ ν΄λ‘μ λΌλ 건 μ μ μμ£ ?
ν΄λ‘μ μ κ°λ
μ μμ§ λͺ¨λ₯΄μ λ€λ©΄,
7μ£Όμ°¨_5μΌμ°¨_μ± κ°λ° μλ ¨_Closure(ν΄λ‘μ )_κ°μΈκ³΅λΆ_TIL
TIL>μ€λμ ν΄λ‘μ μ λν΄μ 곡λΆν΄λ΄€λ€.μ΄μ μ 곡λΆνμλλ°, νμ€νκ² μ΄ν΄νκ³ λμ΄κ°κ² μλλΌμ λ§μ ν΄λ‘μ μ λν΄μ λ§λ‘ μ€λͺ νλ €κ³ λ³΄λκΉλ¨Ήμ κ² κ°μλ€.(κ³Όκ±° ν΄λ‘μ μ 리νλ λ΄ μ
yegenie-coding.tistory.com
μ΄κ±° λ¨Όμ λ³΄κ³ μ€μμ£ !π
μ. λ€μ λμμλ³Όκ²μ.
func escapingClosureEX(completion: () -> Void) {
completion()
}
μ μ½λμμ completionμ νμ
μ λ§€κ°λ³μλ μκ³ λ¦¬ν΄ νμ
λ μλ ννμ
λλ€.
κ·ΈμΉλ§, ν΄λ‘μ λ 1κΈ κ°μ²΄λΌμ λ³μλ μμμ λμ
μ΄ κ°λ₯νκ³ , νλΌλ―Έν° μΈμλ‘ λκ²¨μ€ μ μμ£ !
escapingClosureEX {
print("μ€νΈ!")
} // μ€νΈ!
μ΄λ κ² λ§€κ°λ³μλ‘ ν¨μλ₯Ό λκ²¨μ€ μ μμ΅λλ€!
μ μ΄μ μ¬κΈ°μ completionμ μ μ₯λ ν΄λ‘μ λ₯Ό 5μ΄ λ€μ μ€νμν€κ³ μΆλ€λ©΄ μ΄λ»κ² ν΄μΌν κΉμ?
func escapingClosureEX(completion: () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
completion()
} // Error: Escaping closure captures non-escaping parameter 'completion'
}
μ΄λ κ² νλ©΄ λκ² μ£ ?
κ·Όλ°..
μ΄λ° errorκ° λΉλλ€..
μ΄μ κ° λκΉμ??π€
ν€μλ μμ΄ νλΌλ―Έν°λ‘ λ°λ ν΄λ‘μ λ λͺ¨λ
μμμ μΈκΈνλ Non-escaping closure μ
λλ€.
μ¦, 5μ΄ λ€μ completion ν΄λ‘μ κ° μ€νλκ² μ½λλ₯Ό μΌμ§λ§,
ν¨μκ° μ’
λ£λ¨κ³Ό λμμ ν΄λ‘μ λ ν¨κ» μ’
λ£λ κ±°μ£ ..
κ·Έλμ ν¨μμ νλ¦μμ λ²μ΄λ νΈμΆλμ΄μΌνκΈ° λλ¬Έμ
"completionμ Non-escaping parameterμΌ!!"λΌκ³ μ»΄νμΌλ¬κ° μλ €μ€κ±°μμ.
μ!! λ€μ μ 리ν΄λ³΄μλ©΄,
completionμ Non-escaping Closure(λ§ κ·Έλλ‘ νμΆμ΄ λΆκ°λ₯ν ν΄λ‘μ )λΌμ
ν¨μκ° μ’
λ£λκ³ λ νμ ν΄λ‘μ κ° μ€νλ μ μμ΅λλ€.
κ·Έλμ μ¬μ©νκΈ° μν΄μλ @escaping ν€μλλ₯Ό μ¬μ©ν΄μ£Όμ΄μΌ ν©λλ€.
<Non-escaping Closure>
1. ν¨μ λ΄λΆμμ μ§μ μ€νν λλ§ μ¬μ©
2. νλΌλ―Έν°λ‘ λ°μ ν΄λ‘μ λ μμλ λ³μμ λμ
ν μ μμ
errorκ° λ°μνλκΉ!
completion()μ μ§μ°κ³ , printλ¬Έμ λ£μ΄μ νλ¦μ ν λ² μ΄ν΄λ΄
μλ€.
func escapingClosureEX(completion: () -> Void) {
print("1")
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
print("2")
}
print("3")
}
escapingClosureEX {
}
print("4")
/*
1
3
4
2
*/
μ μ½λλ₯Ό μ€νν΄λ³΄λ©΄,
μ΄λ κ² 1, 3, 4κ° λ¨Όμ print λκ³ , 2κ° print λκ³ μμ΅λλ€.
@escaping ν€μλλ₯Ό μ¬μ©νμ§ μμμ§λ§,
ν¨μ λ΄λΆμμ 5μ΄ λ€μ μ€νλλ asyncAfterλ₯Ό μ¬μ©νκΈ° λλ¬Έμ
ν¨μμ μλͺ
μ£ΌκΈ°κ° λλ νμλ μ€νλ κ²λλ€.
κ·ΈλΌ..
νλΌλ―Έν°λ‘ λ°μ ν΄λ‘μ λ₯Ό λΉλκΈ°λ‘ μ¬μ©νκ³ μΆμ λ & ν¨μμ νλ¦μμ νμΆνκ³ μΆμ λ
μ΄λ»κ² ν΄μΌν κΉμ?π€
λ°λ‘ μμμ μΈκΈνλ @escaping ν€μλλ₯Ό μ¬μ©ν΄μ£Όλ©΄ λ©λλ€!!
곡λΆνλ©΄μ, (completion: @escaping ~~) μ΄λ κ² μκΈ΄ κ±° λ³Έ μ μμΌμ κ°μ?
μ΄κ² λ°λ‘ Escaping Closure μ
λλ€!
completionμ νμ
μ @escapingμ λΆμ¬μ Escaping Closure(μ΄μ€μΌμ΄ν ν΄λ‘μ )λΌλ κ²μ λͺ
μν΄ μ£Όλ κ²λλ€.
λΆμ΄λ μκ°
'μ΄ ν΄λ‘μ λ ν¨μ μ€νμ νλ¦κ³Ό μκ΄μμ΄ μ’
λ£λ μ΄νμλ μ€νλλ λ
μμ΄μΌ!'λΌκ³ λ§ν΄μ£Όλ κ±°μ£ γ
γ
func escapingClosureEX(completion: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
completion()
}
}
μ! μκΉ μλ¬ λ°μνλ μ½λμμ @escaping ν€μλλ₯Ό λ£μ΄μ€¬λλ
μ΄μ μλ¬κ° λ°μνμ§ μμ£ ?
@escaping ν€μλλ μ£Όλ‘ μ½λ°± ν¨ν΄μ μ¬μ©λκ³ ,
λΉλκΈ° μμ
μ΄ μλ£λ μ΄νμ κ²°κ³Όλ₯Ό ν΄λ‘μ λ₯Ό ν΅ν΄ λ°νν΄ μ€λλ€.
escapingClosureEX {
print("(5μ΄ λ€) μ§ !")
}
print("ν¨μ λ!")
/*
ν¨μ λ!
(5μ΄ λ€) μ§ !
*/
μ€νν΄λ³΄λ©΄,
completionμ΄ μ μ€νλ©λλ€!!
κ·ΈλΌ μ΄ Escaping Closureλ μΈμ νμ©νκ² λ κΉμ?
μ λ μ΄λ² ν νλ‘μ νΈλ₯Ό νλ©΄μ λ§λκ² λμ΅λλ€..γ
μν κ²μ νμ΄μ§λ₯Ό λ΄λΉνμλλ°,
1. κ²μμ΄λ₯Ό μ
λ ₯νμ§ μμμ κ²½μ°
2. κ²μμ΄μ ν΄λΉνλ μνκ° μλ κ²½μ°
μ΄ λ κ°μ§ κ²½μ°μ Labelλ‘ λ¬Έκ΅¬λ₯Ό λ£μ΄μ£Όκ³ μΆμμ΅λλ€.
κ·Έλμ URLSessionμΌλ‘ dataλ₯Ό λ°μμ€λ ν¨μμμ
if λ¬Έμ νμ©ν΄μ
'κ²μμ΄ μμ' & 'μ΄λ°! μ°ΎμΌμλ μνμ΄ μμ΅λλ€.'
λΌλ λ¬Έκ΅¬κ° λμ€λλ‘ μ½λλ₯Ό μ§°μμ΄μ!
κ·Έλ°λ°.. μ΄λ€ λ¬Έμ κ° λ°μνλλ!!π€―π±π€―π±
λ°μ΄ν°κ° λμ΄μ¨ μ΄νμ ν΄λΉ μ½λκ° μ€νλμ΄μΌ νλλ°,
λ°μ΄ν°κ° λμ΄μ€κΈ° μ , λμ΄μ¨ ν..
μ€ν μμκ° λ§μ§ μμμ
λ°μ΄ν°κ° μλλ°λ λΆκ΅¬νκ³ ,
'μ΄λ°! μ°ΎμΌμλ μνμ΄ μμ΅λλ€.'λΌλ 문ꡬκ°
μν λͺ©λ‘λ€ λ€μ ν¨κ» λμ€λκ±°μμ..
μ΄λ΄ λ!! μ¬μ©νλ κ²μ΄ λ°λ‘ Escaping Closure(μ΄μ€μΌμ΄ν ν΄λ‘μ )μ
λλ€!!
μ΄λ κ² λ°μ΄ν°λ₯Ό λ°μμ€λ ν¨μμ
@escaping ν€μλλ₯Ό μ¬μ©ν΄μ£Όκ³ , 리ν΄κ°μ λΉμλμ΅λλ€.
κ·Έλ° λ€μ
if λ¬ΈμΌλ‘ μ½λλ₯Ό μμ±νλ λΆλΆμμ!
escaping ν΄λ‘μ μμ 쑰건문μ λ£μ΄μ£Όμμ΅λλ€.
μ΄λ κ² νλ©΄!!
getData()λΌλ λ°μ΄ν°λ₯Ό λ°μμ€λ ν¨μκ° λͺ¨λ μλ£λ νμ
μ΄ μ‘°κ±΄λ¬Έμ μ€νλλλ‘ μ½λλ₯Ό λ°κΎΌκ±°μμ.
μ¬κΈ°μ UIμ κ΄λ ¨λ 건 main threadκ° λ΄λΉν΄μΌνκΈ° λλ¬Έμ
μμ κ°μ μλ¦Όμ΄ λ°κ²λλ€.
μ΄κ±΄ DispatchQueue.main.async{} μμ λ£μ΄μ£Όλ©΄ λ©λλ€.
('mainνν
μΌμ μν€λ λͺ
λ Ήμ΄'λΌκ³ μκ°νμλ©΄ λ©λλ€.)
@escaping ν€μλ νλλ‘..
μ λλ‘ μλνλ κ±Έ λ³΄κ³ .. κ²½μ
νμ΅λλ€..
곡λΆν κ² μ°λ미ꡬλ.. μΆμμ΄μ..γ
γ
π©
escaping ν΄λ‘μ λ₯Ό μ¬μ©νλ©΄, μ΄λ° λΆλΆλ€μ ν΄κ²°ν μ μμ§λ§!!
λ¬Έμ μ λ€λ μλ€κ³ ν΄μ.
1. μ½λ°± μ€μ²©μΌλ‘ μΈν΄ μ½λκ° λ³΅μ‘ν΄μ§ κ°λ₯μ± μμ
2. μλ¬ μ²λ¦¬κ° μ΄λ €μμ§ μ μμ΄ μ½λ°± λ΄μμ λ°μνλ κ°ν μ°Έμ‘° μνμ μ£Όμν΄μΌν¨
μ.. κ°ν μ°Έμ‘° μνμ λ λμΌ..???
λ€.. λ€μ κ²μλ¬Ό μ€ν¬λ₯Ό μν λ‘λ°₯μ΄μμ΅λλ€.
λ€μ κ²μλ¬Ό μ£Όμ λ λ©λͺ¨λ¦¬ κ΄λ¦¬ν΄μ£Όλ μΉκ΅¬ ARC μ
λλ€!!
μλ§.. λ€μ μ£Όμ μ 리ν κ² κ°μμ..γ
(μ΄λ κ² λ ν μ£Ό λ°λ¦¬λ ARC..)
To be continue...β§