Skip to content

Latest commit

ย 

History

History
235 lines (134 loc) ยท 15.6 KB

Introducing Combine.md

File metadata and controls

235 lines (134 loc) ยท 15.6 KB

Introducing Combine

Combine ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์†Œ๊ฐœํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ์œผ๋กœ ์˜ˆ์‹œ๋ฅผ ๋“ค๊ณ  ์žˆ๋‹ค. Wizard School Signup ์•ฑ์€ ํ•™์ƒ๋“ค์ด ์ƒˆ๋กœ์šด ๋งˆ๋ฒ• ํ•™๊ต์— ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๊ฐ„๋‹จํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋Š”๋ฐ, ์šฐ์„  ์„œ๋ฒ„์— ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ•˜์—ฌ ํ™•์ธํ•  ์œ ํšจํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋‹ค. ๋˜ํ•œ ์•ฑ์—์„œ ๋กœ์ปฌ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์น˜ํ•˜๋Š” ์•”ํ˜ธ๋„ ํ•„์š”ํ•˜๋‹ค.

์ด๋Ÿฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ responsiveํ•œ UI๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.

๋จผ์ € ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋Š”๋ฐ, Target/Action์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ์ˆ˜์‹ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ์„ ์ž ์‹œ ๋ฉˆ์ถœ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์œผ๋กœ ์ธํ•ด ์„œ๋ฒ„๋ฅผ ๊ณผ๋ถ€ํ•˜ ์‹œํ‚ค์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, KVO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์— ๋Œ€ํ•œ ์ง„ํ–‰ ์ƒํ™ฉ ์—…๋ฐ์ดํŠธ๋ฅผ ๋“ฃ๋Š”๋‹ค.

URLSession request๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋™๊ธฐ์‹ ๊ฒ€์‚ฌ์™€ ๋ณ‘ํ•ฉํ•ด์•ผ ํ•œ๋‹ค. ๋ชจ๋‘ ์™„๋ฃŒ๋˜๋ฉด KVC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋Œ€๋กœ UI๋ฅผ ๋‹ค์‹œ ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ํ•œ๋‹ค.

CoCoa SDK ์ „์ฒด์—์„œ ๋งŽ์€ ๋น„๋™๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ณธ Target/Action ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ NotificationCenter์™€ ad-hoc callback ๋“ฑ๋“ฑ..

์ด๋“ค์€ ํด๋กœ์ ธ ๋˜๋Š” completion block์„ ์ทจํ•˜๋Š” API ๋“ค์ธ๋ฐ, ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ===> Combine ๋“ฑ์žฅ

A unified, declarative API for processing Values over time

Combine์€ ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ†ตํ•ฉ์ ์ด๊ณ  ์„ ์–ธ์ ์ธ API์ด๋‹ค.

Combine์€ Swift๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ, ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ Swift ๊ธฐ๋Šฅ๋“ค์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” boilerplate ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

Combine์€ ๋˜ํ•œ ํƒ€์ž… ์„ธ์ดํ”„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์—๋Ÿฌ๋ฅผ ์บ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ต์‹ฌ ๊ฐœ๋…์ด ๊ฐ„๋‹จํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ์‚ฌ์šฉํ•˜๋ฉด ํฐ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Combine์€ request-driven ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์„ฑ๋Šฅ์„ ๋ณด๋‹ค ์‹ ์ค‘ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Combine์˜ ํ•ต์‹ฌ ๊ฐœ๋…์€ 3๊ฐ€์ง€์ด๋‹ค.

1๏ธโƒฃ Publisher 2๏ธโƒฃ Subscriber 3๏ธโƒฃ Operator

1. โœ๏ธ Publisher

Publisher๋Š” Combine API์˜ ์„ ์–ธ์ ์ธ ๋ถ€๋ถ„์ด๋‹ค. Publisher๋Š” value์™€ error๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•œ๋‹ค. (๋ฐ˜๋“œ์‹œ values์™€ error๋ฅผ Publisher๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜)

๋˜ํ•œ ๊ฐ’ ํƒ€์ž…์ด๋ฉฐ, Subscriber์˜ ๋“ฑ๋ก์„ ํ—ˆ์šฉํ•œ๋‹ค. Subscriber๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๊ฐ’์„ ์ˆ˜์‹ ํ•œ๋‹ค.

Publisher๋ผ๊ณ  ๋ถ€๋ฅด๋Š” protocol์ด ์žˆ๊ณ , 2๊ฐ€์ง€ associatedtype์ด ์žˆ๋‹ค. Output์€ ์ƒ์„ฑ๋˜๋Š” value์˜ ์ข…๋ฅ˜์ด๊ณ , Failure๋Š” ์ƒ์„ฑ๋˜๋Š” ์˜ค๋ฅ˜์˜ ์ข…๋ฅ˜์ด๋‹ค. Publisher๊ฐ€ ์—๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, associated type์— never๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Publisher์—๋Š” subscribe๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค. generic์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด subscribe๋Š” Subscriber์˜ input์ด Publisher์˜ output๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•˜๊ณ , Subscriber์˜ failure๊ฐ€ Publisher์˜ failure์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

2. โœ๏ธ Subscriber

๋‹ค์Œ์€ Subscriber์ด๋‹ค. Subscriber๋Š” Publisher์˜ ๋ฐ˜๋Œ€ ๊ฐœ๋…์ด๋‹ค. Subscriber๋Š” completion์„ ํฌํ•จํ•˜์—ฌ value๋ฅผ ๋ฐ›๋Š”๋‹ค.

Subscriber๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ value๋ฅผ ๋ฐ›์œผ๋ฉด ๋™์ž‘ํ•˜๊ณ , ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— swift์—์„œ๋Š” ์ฐธ์กฐ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— class์ด๋‹ค.

Subscriber ํ”„๋กœํ† ์ฝœ์ด๋ฉฐ, ๋‘ ์—ฐ๊ด€ํƒ€์ž…์ด input๊ณผ failure๋กœ ๋™์ผํ•˜๋‹ค. Subscriber๊ฐ€ failure๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” Never๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

3๊ฐ€์ง€ ์ฃผ์š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” subscription์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. subscription์€ Subscriber๊ฐ€ Publisher์—์„œ Subscriber๋กœ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋˜ํ•œ input์„ ์ˆ˜์‹ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” completion์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

assign์€ Subscriber์˜ ํ•œ ์˜ˆ์ด๋‹ค. ๊ทธ๋ž˜์„œ class์ด๋ฉฐ, ์ž…๋ ฅ์„ ์ˆ˜์‹ ํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ์— ๊ธฐ๋กํ•œ๋‹ค. Swift์—์„œ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์“ธ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— Assign์˜ Failure ํƒ€์ž…์„ Never๋กœ ์„ค์ •ํ•œ๋‹ค.

Subscriber๋ฅผ ๋ณด์œ ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ์ฒด๋‚˜ ๋‹ค๋ฅธ ํƒ€์ž…์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ๊ฐ์ฒด๋Š” Subscriber๋ฅผ Publisher๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ด ๋•Œ Publisher๋Š” Subscriber์—๊ฒŒ subscription์„ ์ „์†กํ•˜์—ฌ Subscriber๊ฐ€ Publisher๋กœ๋ถ€ํ„ฐ value์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ•˜๋„๋ก ํ•œ๋‹ค.

์ด ์‹œ์ ์—์„œ Publisher๋Š” ํ•ด๋‹น ๊ฐœ์ˆ˜ ์ดํ•˜์˜ value๋ฅผ Subscriber์—๊ฒŒ ์ž์œ ๋กญ๊ฒŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ Publisher๊ฐ€ ์œ ํ•œํ•˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ completion ๋˜๋Š” error๋ฅผ ์ „์†กํ•œ๋‹ค.

ํ•˜๋‚˜์˜ subscription์— ๊ฐ’์ด 0๊ฐœ ์ด์ƒ์ด๋ฉฐ, completion์€ ํ•˜๋‚˜์ด๋‹ค.

ํ•™์ƒ๋“ค์ด ์กธ์—…ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๋“ฃ๊ณ , ๊ทธ๋“ค์ด ์กธ์—…ํ•˜๋ฉด ๋ชจ๋ธ ๊ฐ์ฒด์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ,

Notification Center Publisher๋กœ ์‹œ์ž‘ํ•˜๊ณ , ๊ทธ๋Ÿฐ ๋‹ค์Œ Assign Subscriber๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Merlin์˜ grade ํ”„๋กœํผํ‹ฐ์— ์ƒˆ grade๋ฅผ ์“ฐ๋„๋ก ํ•œ๋‹ค.

๋‹ค์Œ์œผ๋กœ subscribe๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘˜์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ๋˜์ง€ ์•Š๋Š”๋ฐ, type์ด ๋งค์น˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ Notification๊ณผ integer ์‚ฌ์ด์—์„œ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘๊ฐ„์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ๊ทธ๊ฒƒ์ด Operator์ด๋‹ค.

3. โœ๏ธ Operator

Operator๋Š” Publisher ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ์ ์ด๊ณ , valueํƒ€์ž…์ด๋‹ค. Operator๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์ œ๊ฑฐํ•˜๋Š” ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์—…์ŠคํŠธ๋ฆผ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋‹ค๋ฅธ Publisher๋ฅผ ๊ตฌ๋…ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค์šด์ŠคํŠธ๋ฆผ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” Subscriber์—๊ฒŒ ๋ณด๋‚ธ๋‹ค.

Operator์˜ ํ•œ ์˜ˆ์ธ Map์ด๋‹ค. Map์€ ์—…์ŠคํŠธ๋ฆผ, ๊ทธ๋ฆฌ๊ณ  ์—…์ŠคํŠธ๋ฆผ์˜ ouput์„ ์ž์ฒด ouput์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” transform์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.

Map์€ ์ž์ฒด์ ์œผ๋กœ Failure๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์—…์ŠคํŠธ๋ฆผ์˜ Failure ์œ ํ˜•์„ ๋ฐ˜์˜ํ•˜๊ณ  ์ „๋‹ฌํ•œ๋‹ค.

๊ทธ๋ž˜์„œ Map์„ ์‚ฌ์šฉํ•˜๋ฉด Notification๊ณผ integer ์‚ฌ์ด์—์„œ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋™์ผํ•œ Publisher์™€ Subscriber๋ฅผ ์œ ์ง€ํ•˜๊ณ , converter๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด converter๋Š” graduatePublisher์— ์—ฐ๊ฒฐํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, closure๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์ด ํด๋กœ์ €๋Š” Notification์„ ๋ฐ›๊ณ , NewGrade๋ผ๋Š” user info key๋ฅผ ์ฐพ๋Š”๋‹ค. NewGrade๊ฐ€ ์žˆ๊ณ , Integer๋ผ๋ฉด ํด๋กœ์ €๋กœ๋ถ€ํ„ฐ ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๊ฐ’์ด ์—†๊ฑฐ๋‚˜ Integer๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ, ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ 0์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฌด์Šจ ์ผ์ด ์žˆ์–ด๋„ ๊ฒฐ๊ณผ๋Š” ์ •์ˆ˜์ด๋ฏ€๋กœ, Subscriber์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋” fluentํ•œ syntax๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด, ๋ชจ๋“  Publisher๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค. Publisher์˜ extension์ด๊ธฐ ๋•Œ๋ฌธ์— upstream์— self๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์˜ˆ์ œ์—์„œ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด๋ณด์ž. Notification Center Publisher๋ถ€ํ„ฐ ๋ณด์ž๋ฉด, ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ์•ž์„œ ๋ณธ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ mapํ•œ ๋‹ค์Œ, Merlin์˜ grade ํ”„๋กœํผํ‹ฐ์— assign ํ•œ๋‹ค.

Assign์€ cancellableํ•œ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. Cancelation์€ combine์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค. Cancelation์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Publisher ๋ฐ Subscriber์˜ ์‹œํ€€์Šค ์กฐ๊ธฐ์— ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

Publisher์—์„œ ์ผ๋ จ์˜ Operator๋ฅผ ๊ฑฐ์ณ Subscriber๋กœ ๋๋‚˜๋Š” ๊ฐ’์„ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ Operator๋ฅผ ๋งŽ์ด ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, Declarative Operator API๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. (map, filter, reduce ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค.) ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋ณธ๊ฐ’ ๋˜๋Š” ๋Œ€์น˜ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ์Šค๋ ˆ๋“œ ๋˜๋Š” Queue ์ด๋™ (๋ฌด๊ฑฐ์šด ์ฒ˜๋ฆฌ ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜, UI ์ž‘์—…์„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ์ด๋™)ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Dispatch Queue, ํƒ€์ด๋จธ, ํƒ€์ž„์•„์›ƒ ๋“ฑ์˜ ์Šค์ผ€์ค„๋ง๋„ ์ œ๊ณตํ•œ๋‹ค.

Try composition first

๋งŽ์€ ์ž‘์—…์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช‡ ๊ฐœ์˜ Operator๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋ณด๋‹ค๋Š”, ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” Operator๋ฅผ ๋งŽ์ด ์ œ๊ณตํ•ด์„œ, ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ๋˜ํ•œ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก SwiftCollectionAPI์—์„œ ์ด๋ฆ„์„ ๋งŽ์ด ๋”ฐ์™”๋‹ค๊ณ  ํ•œ๋‹ค.

ํ•œ ์ชฝ์—๋Š” ๋™๊ธฐ์‹ API๊ฐ€ ์žˆ๊ณ , ํ•œ ์ชฝ์—๋Š” ๋น„๋™๊ธฐ์‹ API๊ฐ€ ์žˆ๋‹ค. Swift์—์„œ integer๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๋ฉด, Int๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŽ์€ ์ •์ˆ˜๋ฅผ ๋™์‹œ์— ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, int์˜ Array๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Combine์—์„œ ์ด ๊ฐœ๋…์„ ๋น„๋™๊ธฐ ์„ธ๊ณ„์— ๋งคํ•‘ํ•ด๋ณด๋ฉด, ๋‹จ์ผ ๊ฐ’์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๋ฉด Future์„ ์‚ฌ์šฉํ•˜๊ณ , ๋งŽ์€ ๊ฐ’์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Publisher๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ key๊ฐ€ ์—†๊ฑฐ๋‚˜, ์ •์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’ 0์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์—ˆ๋Š”๋ฐ, bad value๊ฐ€ ์ง„ํ–‰๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ , ๊ฒฐ๊ตญ ๋ชจ๋ธ ๊ฐ์ฒด์— ๊ธฐ๋ก๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š”๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ compactMap์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋กœ์ €๊ฐ€ 0์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ ๋‹ค์Œ, 0 ๊ฐ’์„ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํด๋กœ์ €์—์„œ 0์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด, compactMap์ด ์ด๋ฅผ ํ•„ํ„ฐ๋งํ•˜์—ฌ ์ŠคํŠธ๋ฆผ ์•„๋ž˜๋กœ ๋” ์ด์ƒ ์ง„ํ–‰๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

์šฐ๋ฆฌ ํ•™๊ต์— 5ํ•™๋…„ ์ด์ƒ์˜ ํ•™์ƒ๋“ค๋งŒ ์ž…ํ•™์ด ํ—ˆ์šฉ๋œ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, filter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. filter๋Š” predicate์„ ์‚ฌ์šฉํ•˜๊ณ , ํ•ด๋‹น predicate์„ ํ†ต๊ณผํ•˜๋Š” ์š”์†Œ๋งŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋™์ž‘์€ array์˜ filter์™€ ์ •ํ™•ํžˆ ๋™์ผํ•˜๋‹ค.

Publisher์—์„œ ์ฒ˜์Œ 3๊ฐ€์ง€ ์š”์†Œ๋งŒ ์ˆ˜์‹ ํ•˜๋ ค๋ฉด, prefix(3)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 3๊ฐœ์˜ ๊ฐ’์„ ์ˆ˜์‹ ํ•œ ํ›„, ์—…์ŠคํŠธ๋ฆผ์„ cancelํ•˜๊ณ  ๋‹ค์šด์ŠคํŠธ๋ฆผ์œผ๋กœ completion์„ ์ „์†กํ•œ๋‹ค.

๊ทธ๋ž˜์„œ Merlin์ด ์กธ์—…ํ•˜๋ฉด, new grade ํ”„๋กœํผํ‹ฐ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ ๊ฐ’์ด 5๋“ฑ๊ธ‰ ๋ณด๋‹ค ํฌ๊ณ , ์ตœ๋Œ€ 3๋ฒˆ๋งŒ ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ํ™•์ธ ํ•œ ํ›„ ์ตœ์ข…์ ์œผ๋กœ Merline์˜ grade ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•œ๋‹ค.

์•ฑ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๊ธฐ ์ „์—, ์‚ฌ์šฉ์ž๋Š” ์ง€ํŒก์ด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. 3๊ฐ€์ง€ ์ž‘์—…์ด ๋ชจ๋‘ ์™„๋ฃŒ๋˜๋ฉด ๊ณ„์† ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๋˜๋Š”๋ฐ, Zip์ด ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Zip์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—…์ŠคํŠธ๋ฆผ ์ž…๋ ฅ์„ ๋‹จ์ผ ํŠœํ”Œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ๊ณ„์† ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ์—…์ŠคํŠธ๋ฆผ์œผ๋กœ๋ถ€ํ„ฐ์˜ input์ด ํ•„์š”ํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฒซ๋ฒˆ์งธ Publisher๊ฐ€ A๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋‘๋ฒˆ์งธ Publisher๊ฐ€ 1์„ ์ƒ์„ฑํ•˜๋ฉด, ์ด์ œ ํŠœํ”Œ์„ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์„ Subscriber์—๊ฒŒ ๋‹ค์šด์ŠคํŠธ๋ฆผ์œผ๋กœ ์ „์†กํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ๊ฐ Bool ๊ฒฐ๊ณผ ๊ฐ’์„ ์ฃผ๋Š” 3๊ฐ€์ง€ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” Zip์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํŠœํ”Œ์„ ํ•˜๋‚˜์˜ bool์— mapํ•˜๊ณ , ๋ฒ„ํŠผ์˜ isEnabled ํ”„๋กœํผํ‹ฐ์— ๊ธฐ๋กํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Play ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์ „์— 3๊ฐœ์˜ ์Šค์œ„์น˜๋ฅผ ๋ชจ๋‘ ํ™œ์„ฑํ™” ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜๋ฉด ๋ฒ„ํŠผ์„ ๋น„ํ™œ์„ฑํ™” ํ•ด์•ผ ํ•œ๋‹ค. ์ด ์ž‘์—…์€ Combine Latest๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.

zip๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—…์ŠคํŠธ๋ฆผ ์ž…๋ ฅ์„ ๋‹จ์ผ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ•˜๋‚˜๋ผ๋„ ๋น„ํ™œ์„ฑ๋  ๋˜๋ฉด play ๋ฒ„ํŠผ๋„ ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•œ๋‹ค.

์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ์—…์ŠคํŠธ๋ฆผ์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์‹ ํ•œ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. ๋˜ํ•œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ๋‹ค์šด์ŠคํŠธ๋ฆผ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฒซ๋ฒˆ์งธ Publisher๊ฐ€ A๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋‘๋ฒˆ์งธ Publisher๊ฐ€ A1์„ ์ƒ์„ฑํ•  ๋•Œ, ์ด๋ฅผ ๋ฌธ์ž์—ดํ™”ํ•˜์—ฌ ๋‹ค์šด์ŠคํŠธ๋ฆผ์œผ๋กœ ์ „์†กํ•˜๋Š” ํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๋‚˜์ค‘์— ๋‘ ๋ฒˆ์งธ Publisher๊ฐ€ ์ƒˆ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋ฉด, ์ฒซ๋ฒˆ์งธ Publisher ์ด์ „ ๊ฐ’๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ƒˆ ๊ฐ’์„ ์•„๋ž˜๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์—…์ŠคํŠธ๋ฆผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ๋‹ค์šด์ŠคํŠธ๋ฆผ์€ ์—…์ŠคํŠธ๋ฆผ์˜ ๊ฐ€์žฅ ์ตœ์‹  ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์„ธ ๊ฐœ์˜ ์—…์ŠคํŠธ๋ฆผ, ์ฆ‰ ์Šค์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์„ธ ๊ฐœ ๋ชจ๋‘์˜ ๋ถ€์šธ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Combine Latest๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค์‹œ ๋‹จ์ผ Bool ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์žฌ์ƒ ๋ฒ„ํŠผ์˜ isEnabled ํ”„๋กœํผํ‹ฐ์— ๊ธฐ๋กํ•œ๋‹ค.

3๊ฐœ ์ค‘ ํ•˜๋‚˜๋ผ๋„ false๋ผ๋ฉด, ๊ฒฐ๊ณผ๋Š” false๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. 3๊ฐœ ๋ชจ๋‘๊ฐ€ true๋ผ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ true์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์•ฑ์—์„œ ์ ์ง„์ ์œผ๋กœ Combine์„ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ๋Š”๋ฐ, ์•ฑ์—์„œ Combine์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์†Œ์— ๋Œ€ํ•œ ์ œ์•ˆ์„ ํ•˜์ž๋ฉด,

Notification Center๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์•Œ๋ฆผ์„ ๋ฐ›์€ ๋‹ค์Œ ์•Œ๋ฆผ ๋‚ด๋ถ€๋ฅผ ๋ณด๊ณ  ์ž‘์—… ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ• ๋•Œ filter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋„คํŠธ์›Œํฌ ์ž‘์—…์—์„œ zip์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ URLSession์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•œ ๋‹ค์Œ, json decoder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ž์‹ ์˜ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์“ฐ๋Š” Operator๋กœ decode๊ฐ€ ์žˆ๋‹ค.


์ถœ์ฒ˜