๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS/iOS

[iOS] @escaping (2) - ์˜ํ™” API ์˜ˆ์ œ๋กœ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ (@escaping with movieAPI Example)

by Fomagran ๐Ÿ’ป 2020. 11. 1.
728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š” 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


์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ

 

 

fomagran/Escaping-Example

Contribute to fomagran/Escaping-Example development by creating an account on GitHub.

github.com

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€