์๋ ํ์ธ์ Foma ์ ๋๋ค !!
์ ์๊ฐ์๋ Escaping Closure๋ฅผ ๊ณต์ ๋ฌธ์๋ฅผ ํตํด ์ ์์ ์์ ๋ก ์์๋ณด์๋๋ฐ์. ( ๊ถ๊ธํ์ ๋ถ๋ค์ ์ฌ๊ธฐ ๋ฅผ ๋๋ฌ์ฃผ์ธ์)
๊ณต์ ๋ฌธ์์ ์์ ๋ก๋ ์ดํดํ๊ธฐ๊ฐ ํ๋์ ๋ถ๋ค์ด๋ ์ด๊ฒ ์ด๋์ ์ฐ์ด๋์ง ๊ตฌ์ฒด์ ์ผ๋ก ์๊ณ ์ถ์ ๋ถ๋ค์ ์ํด ์์ฑํ๊ฒ ๋์์ต๋๋ค.
์ฐ์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๊ณณ์ API๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ๋ฐฉ์์ผ๋ก ๋ฐ์์ฌ ๋์ธ๋ฐ ์์ ๋ฅผ ํตํด ์์๋ณด๊ฒ ์ต๋๋ค.
Storyboard
์ฐ์ ์ฒซ๋ฒ์งธ๋ก ๋ค๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ์ ํ ์ด๋ธ๋ทฐ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํด์ค๋๋ค.
๊ทธ ๋ค์ ํ ์ด๋ธ๋ทฐ ์ ์ ์ํํฌ์คํฐ๋ฅผ ๋์ธ ์ด๋ฏธ์ง๋ทฐ์ ์ํ ์ด๋ฆ์ ๋์ธ ๋ ์ด๋ธ์ ๋ฃ์ด์ค๋๋ค.
Xcode
ํ ์ด๋ธ๋ทฐ์ ์ ์ฐ๊ฒฐํด์ค๋๋ค.
์ํ ํฌ์คํฐ์ ์ด๋ฆ์ ๊ฐ์ง ๋ชจ๋ธ์ ๋ง๋ค์ด์ค๋๋ค.
MoiveAPIํ์ผ์ ๋ง๋ค์ด์ค ๋ค ์ํ๋ชจ๋ธ์ ๋ง๋ค์ด ์ํ ๋ฐฐ์ด ์์ ๋ฃ์ด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ๋ก ์๋์ MovieAPIํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ movie๋ชจ๋ธ์ ๋ด์ movies๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋๋ค.
๋๋์ด ์ด์ ์ด์ค์ผ์ดํ์ ํ๋ ํจ์ ์ธ์๊ฐ์ Bool,[Movie]๋ฅผ ๋ด์ ํด๋ก์ ธ๋ฅผ completion์ผ๋ก ๋ง๋ค์ด์ค๋๋ค.
API์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๊ณผ์ ์ ๊ฐ๋จํ for๋ฌธ์ ํตํด ์์ movieArray์ ๋ด๊ฒจ์๋ movie๋ค์ movies์ ๋ด์์ฃผ๊ฒ ์ต๋๋ค.
์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ณผ์ ์ ๋ณดํต ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
๊ณ ๋ก ์ ๋ ๋์คํจ์นํ asyncAfter๋ฅผ ์ด์ฉํ์ฌ ๋น๋๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์๊ฐ์ 5์ด๋ก ๊ฐ์ ํด ๋๋ ์ดํด์ฃผ๊ณ completion์ ๋ฐ์ดํฐ๋ฅผ
์ฑ๊ณต์ ์ผ๋ก ๋ฐ์๋์ง ์ฌ๋ถ์ธ Bool๊ฐ์ true๋ฅผ ๋ฃ์ด์ฃผ๊ณ ์ํ๋ฐ์ดํฐ์ธ moive๋ฅผ ๋ฃ์ด์ฃผ๊ฒ ์ต๋๋ค.
(์๋์ ๊ฐ์ด completion์ด ์ธ๋ถ๋ฉ์ธ์ฐ๋ ๋๋ก ํ์ถํด๋ ์ค๋ฅ๊ฐ ๋์ง ์์ต๋๋ค.)
(๋ง์ฝ noescape์ธ ํจ์๋ผ๋ฉด ๋น์ฐํ ์๋์ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.)
ํ ์ด๋ธ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ์ด๋ํด์ ๋จผ์ movie๋ชจ๋ธ์ ๋ด์ ๋ฐฐ์ด movies๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ ์ด๋ธ๋ทฐ๋ฅผ moives์ ๊ฐฏ์๋งํผ ๋ณด์ฌ์ง๊ฒ ์ค์ ํ๊ณ , ๊ฐ ์ ์ ์ด๋ฏธ์ง์ ํ์ดํ์ movies์์ image์ title๋ก ์ค์ ํด์ค๋๋ค.
๋ง์ง๋ง์ผ๋ก MovieAPI์์ getMovieWithEscapingํจ์๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
ํด๋ก์ ธ์ ์ธ์๊ฐ์ด true๋ผ๋ฉด (์ฑ๊ณต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์๋ค๋ฉด) ํ์ฌ ํ ์ด๋ธ๋ทฐ์ปจํธ๋กค๋ฌ์ movies๋ฅผ ํด๋ก์ ธ ์์์ ๋ฐ์์จ movies๋ก ์ค์
ํด์ค๋๋ค. ๊ทธ ๋ค์ ํ ์ด๋ธ๋ทฐ๋ฅผ ๋ฆฌ๋ก๋ ์์ผ์ค๋๋ค.
์๋ somthing to do1 , something to do2 ๋ ๋น๋๊ธฐ๋ก ์ ์ฒ๋ฆฌ๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
๋ง์ฝ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋์ง ์์๋ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋์ ๋ด๋ด ์๋ ์๋ ์ฝ๋๋ค์ด ์คํ๋์ง ์๊ฒ ์ฃ ?
์ฑ์ ์คํ์ํค๋ฉด ์๋์ ๊ฐ์ด Something to do1๊ฐ ์ถ๋ ฅ๋๋ฉด์ ๋ค๋น๊ฒ์ด์ ํ์ดํ์ด ๋ฐ๋๊ณ Something to do2๊ฐ ์ถ๋ ฅ๋๊ณ ์ผ์ชฝ ๋ฐ๋ฒ
ํผ ์์ดํ ์ด ๋จผ์ ๋ฐ๋ ๋ค 5์ด ๋ค์ ๋ฐ์ดํฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์์์ง๋ฉด ํ ์ด๋ธ๋ทฐ๊ฐ ๋ฆฌ๋ก๋๋๋ฉด์ ์ํ ์ฌ์ง๊ณผ ํ์ดํ๋ก ๋ฐ๋๊ฒ๋ฉ๋๋ค.
GIF Example
์๋๋ ์คํ์ํจ ํ๋ฉด์ ๋๋ค.
PS
๊ทธ๋ ๋ค๋ฉด ๋ง์ฝ escape์์ด ๋น๋๊ธฐ์ฒ๋ฆฌ๋ฅผ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
๋ฐ๋ก NotificationCenter๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋๋ค!! (NotificationCenter์ ๋ํด ์๊ณ ์ถ์ผ์ ๋ถ๋ค์ ์ฌ๊ธฐ ๋ฅผ ๋๋ฌ์ฃผ์ธ์
MovieAPI์์ Movieํด๋์ค์ ์ธ์๊ฐ์ ๋ฐ์ง ์๋ ํจ์๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
๊ทธ ๋ค ๋ฐ๋ก ๋๊ฐ์ด ๋์คํจ์นํ ์ด์ ํฌ์ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ 5์ด ๋๋ ์ด๋ฅผ ์ฃผ๊ณ ์ํ๋ค์ ๋ด์์ฃผ๊ฒ ์ต๋๋ค.
for๋ฌธ์ด ๋๋๋ฉด NotificationCenter๋ฅผ ์ด์ฉํด ์๋ฆผ์ ์ฃผ๊ณ movies๋ฅผ userInfo๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฒ ์ต๋๋ค.
๊ทธ ๋ค ํ ์ด๋ธ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ์ด๋ํด ๋ทฐ๋๋๋ก๋์ addObserver๋ฅผ ํด์ฃผ๊ณ MovieAPI์ getMovieNoCompletion์ ์คํ์์ผ์ฃผ๊ณ
@objcํจ์๋ movies๋ฅผ userInfo์ ๋ด๊ธด movies๋ก ๋ฐ๊ฟ์ฃผ๊ณ ํ ์ด๋ธ๋ทฐ๋ฅผ ๋ฆฌ๋ก๋ ํด์ค๋๋ค.
๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด ๋น๋๊ธฐ์ฒ๋ฆฌ ๋ฐฉ์์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ๋๋ฌ์ ๋ ๋์ผํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ๋์ธ ์ ์์ต๋๋ค.
ํ์ง๋ง NotificationCenter์ addObserver๋ฅผ ์ดํด๋ณด๋ฉด ์ด๊ฒ ๋ํ @escaping์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๊ณ ๋ก ๋น๋๊ธฐ์ฒ๋ฆฌ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด Escape Closure ๋ฐ๋์ ํ์ํ ๊ฒ์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค.
Source Code & Github
์ ์ฒด ์์ค ์ฝ๋
๋๊ธ