μ§λ ν¬μ€ν μμ ν΄λ‘μ (Closure)μ κΈ°λ³Έμ μΈ κ°λ μ λν΄ μ 리νμλλ°μ,
μ΄λ² ν¬μ€ν μμλ Escaping Closureμ λν΄ μμ보λλ‘ νκ² μ΅λλ€!π
Escaping Closureλ?
escaping closureλ ν΄μ κ·Έλλ‘ νμΆ ν΄λ‘μ λΌκ³ λ λΆλ¦¬λλ°μ,
λ§ κ·Έλλ‘ 'νμΆ κ°λ₯ν' ν΄λ‘μ λΌκ³ ν μ μμ΅λλ€.
νμΆ..? μ΄λλ₯Ό νμΆν΄...? λΌλ μλ¬Έμ΄ λμ€ κ² κ°μλ°μ,
μμλ₯Ό ν΅ν΄ κΈ°λ³Έ ν΄λ‘μ μ λΉκ΅νλ©° μ΄ν΄ν΄λ³΄λλ‘ ν©μλ€!!
μ΄μ ν¬μ€ν μμ ν¨μμ νλΌλ―Έν°λ‘ ν΄λ‘μ λ₯Ό μ λ¬ν μ μμμ μ€λͺ νκΈ° μν΄ μ¬μ©νλ μμλ₯Ό κ·Έλλ‘ λ€κ³ μ μ€λͺ ν΄λ³΄κ² μ΅λλ€!
// ν¨μλ₯Ό νλΌλ―Έν°λ‘ μ λ¬λ°λ doSomethingμ΄λΌλ ν¨μ
func doSomething(closure: () -> ()) {
closure()
}
μ΄ ν¨μμ ν΄λ‘μ λ₯Ό νλΌλ―Έν°λ‘ μ λ¬ν΄μ μ€νμμΌλ³Έλ€λ©΄?
μμ μ½λλ doSomething ν¨μμ print("Hello!")λΌλ κ΅¬λ¬Έμ΄ λ΄κΈ΄ ν΄λ‘μ κ° closureλΌλ μ΄λ¦μ νλΌλ―Έν°λ‘ μ λ¬λ μνμΈλ°μ,
viewDidLoad()μμ νΈμΆμ΄ λλ©΄ doSomething ν¨μ λ΄λΆμμ closure λΌλ μ΄λ¦μΌλ‘ μ€νμ΄ λ©λλ€.
μ€ν ν μ½μμ νμΈν΄λ³΄λ©΄ Hello! κ° μ μ°ν κ²μ 보λ νΈμΆ ν μ€νκΉμ§ μ λκ³ μμ΅λλ€!
κ·Έλ°λ°, λ§μ½ μ΄ ν΄λ‘μ λ₯Ό μ μ₯ν΄λκ³ λ€λ₯Έ κ³³μμ νΈμΆνλ €κ³ νλ€λ©΄ μ΄λ»κ² λ κΉμ?
ν΄λ‘μ μ μΌκΈκ°μ²΄μ νΉμ±μ νμ©ν΄μ ν¨μ μΈλΆμ ν΄λ‘μ λ₯Ό λ΄λ λ³μλ₯Ό μ μΈν΄μ
μ΄ λ³μμλ€κ° νλΌλ―Έν°λ‘ λμ΄μ¨ ν΄λ‘μ λ₯Ό λ΄μ μ μ₯ν΄λ³΄κ² μ΅λλ€!
μΈλΆμ μ μΈλ λ³μμΈ nonEscapingClosureμ closureλΌλ μ΄λ¦μ νλΌλ―Έν°λ‘ λμ΄μ€λ ν΄λ‘μ λ₯Ό λ£μΌλ €κ³ νλ
μλ¬κ° λ°μνλ κ²μ νμΈν μκ° μμ΅λλ€!
μλ¬ λ©μμ§λ₯Ό νμΈν΄λ³΄λ closureλΌλ μ΄λ¦μ non-escaping νλΌλ―Έν°λ₯Ό escaping closureλ‘ μ μΈνλΌκ³ νλ€μ!
μ΄ μλ¬λ₯Ό ν΅ν΄ μ μ μλ κ²μ
Swiftμμ ν¨μμ νλΌλ―Έν°λ‘ μ λ¬λ ν΄λ‘μ λ κΈ°λ³Έμ μΌλ‘ ν¨μ λ΄λΆ scope μμμλ§ μ¬μ©μ΄ κ°λ₯νλ€λ κ²μ λλ€.
μ΄λ κΈ°λ³Έμ μΌλ‘ ν΄λ‘μ (non-escaping closure)λ ν¨μλ₯Ό νμΆν μ μλ€λ κ²μ μλ―Έν©λλ€.
μ¦, νλΌλ―Έν°λ‘ μ λ¬λ ν΄λ‘μ λ 첫λ²μ§Έ μμμ κ°μ΄ μ§μ νΈμΆμ κ°λ₯νμ§λ§,
λλ²μ§Έ μμμ²λΌ μΈλΆ λ³μλ μμμ μ μ₯ν΄μ ν¨μ ꡬ문 λ° λ€λ₯Έ κ³³μμ μ¬μ©ν μ μμ΅λλ€!
λν, νλΌλ―Έν°λ‘ μ λ¬λλ ν΄λ‘μ λ ν΄λΉ ν¨μκ° λ¦¬ν΄λκΈ° μ΄μ μ μ€νμ΄ λ©λλ€.
μ¦, ν¨μκ° λ°νλμ΄ μ’ λ£λ νμλ ν΄λΉ ν΄λ‘μ κ° μ€νλ μ μλ€λ λ»μ λλ€!
μ΄μ μμμ λ€μλ μλ¬Έμ΄ ν΄κ²°λμλμ? νμΆ κ°λ₯ν ν΄λ‘μ ? μ΄λλ₯Ό νμΆνλ€λκ±°μ§??
ν¨μλ₯Ό νμΆν΄μ ν¨μ ꡬ문 λ°μμ μ¬μ©ν μ μλ ν΄λ‘μ κ° λ°λ‘ νμΆ ν΄λ‘μ , Escaping Closure μ λλ€!!
νμΆ ν΄λ‘μ μ νμ©
κ·Έλ λ€λ©΄, νμΆ ν΄λ‘μ λ μ΄λ»κ² μ¬μ©νκ³ μ΄λ€ μν©μμ νμ©ν μ μμκΉμ??
μ΄ λν μμ μ½λλ‘ μμλ΄ μλ€!ππ
iOS κ°λ°μ νλ©° λ€νΈμν¬ ν΅μ μ ν΄λ³΄μ λΆλ€μ΄λΌλ©΄ μλμ κ°μ΄ @escapingμΌλ‘ μ μΈλ ν΄λ‘μ λ₯Ό λ§μ΄ λ³΄μ ¨μκ±°λΌκ³ μκ°ν©λλ€!
μ΄λ κ² μμ @escapingμ΄ λΆμ ν΄λ‘μ κ° Escaping Closure(νμΆ ν΄λ‘μ )μ λλ€.
μμμ μλ¬ λ©μμ§κ° λ΄μλ μμ μ½λμμλ Fixλ₯Ό ν΄λ¦νλ©΄ μμ κ°μ΄ λ°λλ κ²μ νμΈν μ μλλ°μ,
μ΄λ κ² ν΄λ‘μ μμ @escapingλ§ λΆμ¬μ£Όλ©΄ ν΄λ‘μ λ νμΆ κ°λ₯ν μνκ° λ©λλ€!
escaping closure λ§λλ λ°©λ², μ λ§ μ½μ£ ??
ν΄λ‘μ κ° ν¨μλ‘λΆν° νμΆ(escape)νλ€λ κ²μ ν΄λΉ ν¨μμ μΈμλ‘ ν΄λ‘μ κ° μ λ¬λμ§λ§, ν¨μκ° λ°νλ ν μ€νλλ κ²μ μλ―Έν©λλ€.
ν¨μμ μΈμκ° ν¨μμ μμμ νμΆνμ¬ ν¨μ λ°μμ μ¬μ©ν μ μλ€λ κ°λ μ κΈ°μ‘΄μ μ°λ¦¬κ° μκ³ μλ λ³μ/μμμ scope(==λ²μ, μμ) κ°λ μ 무μν©λλ€.
μλνλ©΄ ν¨μμμ μ μΈλ λ‘컬 λ³μ, μμκ° λ‘컬μ μμμ λ°μ΄λμ΄ ν¨μ λ°μμλ μ ν¨νκΈ° λλ¬Έμ λλ€.
λ°λΌμ, ν΄λ‘μ λ₯Ό νμΆ κ°λ₯νκ² λ§λ€λ©΄ κ°λ₯ν κ²μ ν¬κ² 2κ°μ§ μ λλ€.
1οΈβ£ ν΄λ‘μ λ₯Ό μΈλΆ λ³μ/μμμ μ μ₯ κ°λ₯ν©λλ€.
2οΈβ£ ν¨μκ° λ°νλμ΄ μ’ λ£λ μ΄νμλ ν΄λ‘μ μ€νμ΄ κ°λ₯ν©λλ€.
ν¨μ μ’ λ£ μ, λ΄λΆμ ν΄λ‘μ λ κ°μ΄ λ©λͺ¨λ¦¬μμ ν΄μ λμ§λ§
@escapingμ μ΄μ©ν΄ νμΆ ν΄λ‘μ λ‘ μ μΈν κ²½μ°, ν΄λΉ ν΄λ‘μ λ§μ μν΄ λ©λͺ¨λ¦¬ 곡κ°μ λ§λ€κ² λ©λλ€.
κ·Έλ κΈ° λλ¬Έμ ν¨μ μΈλΆμμλ μ¬μ©μ΄ κ°λ₯ν κ²μ λλ€!
μμ κ°μ νμΆ ν΄λ‘μ μ νΉμ§μ μλ² ν΅μ μ, λΉλκΈ°μ μ²λ¦¬κ° νμν κ²½μ° λ± λ€μν μν©μμ μ μ©νκ² νμ©λ μ μμ΅λλ€.
μλ² ν΅μ μ νμΆ ν΄λ‘μ λ₯Ό Completion Handlerλ‘ μ¬μ©νλ κ²½μ°κ° κ°μ₯ λνμ μΈ νμ© μμλΌκ³ μκ°νλλ°μ!
μμ μμλ₯Ό λ€μ κ°μ Έμ μμΈν μ€λͺ ν΄λ³΄λλ‘ ν κ²μ!
μμ μ½λλ moyaλΌλ ν΅μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ΄μ©ν΄ μμ±ν API μ½λμΈλ°μ!
κ²μκΈ μΈλ€μΌ ν΄λ¦ μ, μ΄ ν¨μλ₯Ό νΈμΆν΄ ν΄λΉ ν¬μ€νΈμ μμΈ λ΄μ©μ μ‘°νν μ μλλ‘ νκΈ° μν΄ ν΅μ λΆλ₯Ό μ§μ€ κ²μ λλ€.
μ¬κΈ°μ Completion Handlerλ‘ νμΆ ν΄λ‘μ κ° μ¬μ©λλ κ²μ λ³΄μ€ μ μλλ°μ,
λ¨Όμ Completion Handlerμ λν΄ κ°λ¨ν μ€λͺ νκ³ λμ΄κ°μλ©΄!
Completion Handlerλ 'μλ£ + λ΄λΉμ' λ‘ μ§μν μ μλ―μ΄ μ΄λ ν μΌμ΄ λλ¬μ λ μ§νν μ 무λ₯Ό λ΄λΉν©λλ€.
νμΆ ν΄λ‘μ λ ν¨μ μ’ λ£ μ΄νμ μ€νμ΄ κ°λ₯νκΈ° λλ¬Έμ Completion Handlerλ‘ λ§μ΄ μ¬μ©μ΄ λλκ²μ΄μ£ !!
μμ μ½λλ₯Ό λ―μ΄λ³΄μλ©΄, μλΉμ€ νμΌμ μ μλ getReviewPostDetailμ΄λΌλ ν΅μ μ μμ²νκ³
ν΅μ μ κ²°κ³Όλ¬Όμ resultλΌλ νλΌλ―Έν°λ‘ λ°μ success, failure λΌλ κ° μΌμ΄μ€μ ν΄λΉνλ μ²λ¦¬λ₯Ό ν΄μ£Όκ³ μμ΅λλ€.
μ΄λ, μλ² ν΅μ μ μ±κ³΅νκΈ°λ§ νλ©΄(statusCodeμ μκ΄μμ΄) resultκ°μ .successμ λλ€.
μ¦, μλ² ν΅μ μ체μ μ€ν¨νμ κ²½μ°λ§ .failureκ° λλ κ²μ΄μ£ !
κ·Έλμ .successμΈ κ²½μ°(==μλ² ν΅μ μ μ±κ³΅νμ κ²½μ°), statusCodeμ λ°λΌ μΈλΆμ μΈ μ±κ³΅ μ€ν¨ μ¬λΆλ₯Ό νλ¨ν΄μ£Όμ΄μΌ ν©λλ€.
μ΄λ₯Ό μν΄μ getReviewPostDetailJudgeData()λΌλ ν¨μλ₯Ό νΈμΆν΄μ£Όλ κ²μ λλ€.
getReviewPostDetailJudgeData()μμλ μμ κ°μ΄ statusCodeμ λ°λΌ NetWorkResultλ₯Ό λ°νν΄μ€λλ€.
μ΄λ, μ±κ³΅ μμ decodeλ dataλ₯Ό κ°μ΄ λ°νν΄μ£Όκ³ μλ κ²μ νμΈνμ€ μ μμ΅λλ€.
μμ ν΅μ λΆ μ½λμμ completionμ΄ νμΆ ν΄λ‘μ λ‘ μ μΈλμ΄ μκΈ° λλ¬Έμ
μλ²μμ resultλ₯Ό λ°μμ€λ μμ μ΄ λλ¬μ λ, μ΄λ₯Ό νΈμΆνλ κ²μ΄ κ°λ₯ν κ²μ λλ€!
λ§μ½, μ¬κΈ°μ νμΆ ν΄λ‘μ λ₯Ό μ¬μ©ν΄μ£Όμ§ μλλ€λ©΄?
μλ²ν΅μ μ΄ λλλ©΄ ν¨μκ° μ’ λ£λκΈ° λλ¬Έμ μ΄λ κ² μΈλΆμ μΈ μ±κ³΅ μ€ν¨ μ¬λΆλ₯Ό νλ¨νμ¬ μλ²μμ μνλ λ°μ΄ν°λ₯Ό λ°μμ μ²λ¦¬νλ κ²μ΄ λΆκ°λ₯ν΄μ§κ² λ©λλ€.
μ΄μ escaping closureλ₯Ό μ΄λ€ κ²½μ°μ μ¬μ©νλμ§, μ μ¬μ©νλμ§ κ°μ΄ μ’ μ‘νμλμ~?
μ΄λ κ² μλ² ν΅μ μ λΏλ§ μλλΌ,
λΉλκΈ° μ²λ¦¬κ° νμν κ²½μ°λ ν¨μ μ’ λ£ μ§νμ μ΄λ²€νΈ μ²λ¦¬λ₯Ό μν΄ νμΆ ν΄λ‘μ κ° μ λ§ λ§μ΄ μ¬μ©λλ
μ μ΄ν΄ν΄λλ©΄ μ λ§ μ μ©ν κ² κ°μ΅λλ€!
μ°Έκ³ μλ£
https://i-colours-u.tistory.com/17?category=893082
https://dongminyoon.tistory.com/14
https://osoomoovo.tistory.com/175
'π iOS > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] enumerated() (0) | 2023.01.07 |
---|---|
[Swift] κ³ μ°¨ν¨μ - map, filter, reduce (1) | 2022.11.29 |
[Swift] νμ μΆλ‘ κ³Ό νμ μ΄λ Έν μ΄μ (0) | 2022.07.31 |
[Swift] if letκ³Ό guard letμ μ°¨μ΄ (4) | 2022.03.04 |
[Swift] ν΄λ‘μ (Closure) (4) | 2022.02.16 |