๐ŸŽ ์•„์ด-์˜ค-์—์Šค/๐Ÿ“ฑ iOS ๊ฐœ๋ฐœ

[iOS-WWDC2019] Combine ์‚ฌ์šฉํ•˜๊ธฐ (1) - Publisher

๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด 2021. 10. 12. 01:24

Combine in Practice 

์˜ค๋Š˜์€ WWDC์—์„œ ๋ฐœํ‘œ๋œ ์ปด๋ฐ”์ธ์— ๋Œ€ํ•ด ๋ฒˆ์—ญํ•˜๋ฉฐ ๊ณต๋ถ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ์˜ค์—ญ์ด๋‚˜ ์˜์—ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋” ์ž์„ธํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์„ธ์…˜์—์„œ ํ™•์ธํ•ด๋ณด์„ธ์š”...! ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค~!

 

Combine in Practice - WWDC19 - Videos - Apple Developer

Expand your knowledge of Combine, Apple's new unified, declarative framework for processing values over time. Learn about how to...

developer.apple.com

 

์ปด๋ฐ”์ธ์ด ๋ญ”๋ฐ?

์šฐ๋ฆฌ์˜ ์ฝ”๋“œ์—์„œ ์šฐ๋ฆฌ๋Š” ์ž์ฃผ ์–ด๋–ค ์ด๋ฒคํŠธ๋‚˜ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๋Š” Publisher์™€ ์ด ๋ฐœํ–‰๋œ ๊ฐ’์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๋Š” Subscriber์˜ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋‚˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๋‹ค๋ฅธ ์˜์—ญ์˜ ์ฝ”๋“œ๊ฐ€ ์ด ๋‘˜์„ ์—ฐ๊ฒฐํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋กœ ์—ฐ๊ฒฐ์ด ๋œ ์ดํ›„์—๋Š” Subscriber๊ฐ€ ๊ฐ’์„ ๋ฐ›๊ณ ์‹ถ๋‹ค๋Š” ์š”์ฒญ์„ Publisher์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , Publisher๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ˜๋ ค๋ณด๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณต๋˜๊ณ  Publisher๊ฐ€ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์ž‘์—…์ด ๋ชจ๋‘ ๋๋‚˜ ๋” ์ด์ƒ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ง€์†๋ฉ๋‹ˆ๋‹ค. 

 

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ํ†ต์‹ ์€ ์ด๋ฏธ ๋งŽ์€ ๊ณณ์— ์ ์šฉ๋˜๊ณ  ์žˆ๋Š”๋ฐ์š”, ์ฝœ๋ฐฑ, ํด๋กœ์ €์™€ ๊ฐ™์ด ๋น„๋™๊ธฐ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ํ†ต์‹  ํŒจํ„ด์ด ์ปด๋ฐ”์ธ์ด ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์ปด๋ฐ”์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์‹œ๊ฐ„์— ํ๋ฆ„๊ณผ ํ•จ๊ป˜ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ†ตํ•ฉ๋œ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๊ฐ’์˜ Publisher๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

์ปด๋ฐ”์ธ์„ ์‚ฌ์šฉํ•ด๋ณด์ž

์ปด๋ฐ”์ธ์—์„œ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๋Š” Publisher๋Š” Publisher ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœํ† ์ฝœ์—๋Š” ๋‘ ๊ฐ€์ง€ associatedtype์ด ์žˆ๋Š”๋ฐ์š”, Output์€ Publisher๊ฐ€ ๋ฐœํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์˜ ์ข…๋ฅ˜๋ฅผ ์˜๋ฏธํ•˜๊ณ , Failure๋Š” ์ด Publisher์˜ ์‹คํŒจ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Publisher ํ”„๋กœํ† ์ฝœ์€ ์–ด๋–ป๊ฒŒ Subscriber๋ฅผ ๋“ฑ๋กํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”, Subscriber๋Š” ๋ฐ˜๋“œ์‹œ Publisher์˜ Ouput๊ณผ ๋™์ผํ•œ ํƒ€์ž…์˜ Input์„ ๊ฐ€์ ธ์•ผํ•˜๊ณ , ๋™์ผํ•œ ํƒ€์ž…์˜ Failure๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. 

 

์—ฌ๊ธฐ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฉ‹์ง„ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! ์ด ๋งˆ๋ฒ•์‚ฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์›ํ•˜๋Š”๋ฐ์š”, ์ž์‹ ์ด ์„ค๋ฆฝํ•  ์ƒˆ๋กœ์šด ๋งˆ๋ฒ•์‚ฌ ํ•™๊ต์—์„œ ์‚ฌ์šฉํ•  ์•ฑ์ด์ฃ . ์ด ์•ฑ์— ๋“ค์–ด๊ฐˆ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค๋ฅธ ๋งˆ๋ฒ•์‚ฌ๋“ค์— ์˜ํ•ด ๊ณต์œ ๋œ ๋ฉ‹์ง„ ๋งˆ๋ฒ•๊ธฐ์ˆ ๋“ค์„ ์•ฑ์„ ํ†ตํ•ด ๋‹ค์šด๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋งˆ๋ฒ•์‚ฌ๋Š” ์•ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž์ธ ์ €์—๊ฒŒ ์ด๋ ‡๊ฒŒ ์ƒ๊ธด UI์Šค์ผ€์น˜๋ฅผ ์ฃผ์—ˆ์ฃ .

 

์ด ์•ฑ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๋Š” ์ปด๋ฐ”์ธ์„ ์‚ฌ์šฉํ•ด์„œ Trick Name ๋ ˆ์ด๋ธ”์˜ ์ด๋ฆ„์„ ์ƒˆ๋กœ ๋‹ค์šด๋ฐ›์€ ๋งˆ๋ฒ•๊ธฐ์ˆ ์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ปด๋ฐ”์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด, NotificationCenter๋Š” ํŠน์ •ํ•œ Notification์„ ์œ„ํ•œ Publisher๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„์ฒ˜๋Ÿผ NotificationCenter๋ฅผ ํ†ตํ•ด Publisher๋ฅผ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด publisher ํ•จ์ˆ˜๋Š” Publisher๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปด๋ฐ”์ธ์—์„œ ์ •๋ง๋กœ ์ค‘์š”ํ•œ๊ฑด Publisher์˜ ouput๊ณผ failure ํƒ€์ž…์ด์ฃ .

 

์ด๋ ‡๊ฒŒ ๋ฐ˜ํ™˜๋œ Publisher๋Š” output์œผ๋กœ Notification์„ ๊ฐ€์ง€๊ณ ,failure๋กœ Never๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” Notification์„ ๋ฐœํ–‰ํ•˜๋Š” Publisher๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์šด๋กœ๋“œํ•œ ๋งˆ๋ฒ• ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

 

๊ณ ๋ง™๊ฒŒ๋„ ์ด ๋ฐ์ดํ„ฐ๋Š” ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ปด๋ฐ”์ธ์€ notification์„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ map ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค! Sequence์— ๋“ค์–ด์žˆ๋Š” map๊ณผ ์•„์ฃผ ์œ ์‚ฌํ•˜์ฃ . ์ด์ œ ์šฐ๋ฆฌ์˜ Publisher๋Š” ๋ณ€ํ™˜๋œ Data ํƒ€์ž…์„ output์œผ๋กœ ๊ฐ€์ง€๊ณ  ์—ฌ์ „ํžˆ failure๋Š” Never๋กœ ๊ฐ€์ง€๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

 

๋งˆ๋ฒ•์‚ฌ ์นœ๊ตฌ๊ฐ€ ํ•œ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ๋” ์•Œ๋ ค์ฃผ์—ˆ๋Š”๋ฐ์š”, data์˜ ๊ฐ’์„ JSON ํ˜•ํƒœ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๋””์ฝ”๋”ฉ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ปด๋ฐ”์ธ์˜ ์ƒˆ๋กœ์šด Operator๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด Operator๋Š” tryMap ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ map๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ Error๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ŠคํŠธ๋ฆผ์— failure๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

Publisher์˜ ํƒ€์ž…์ด ๋‹ค์‹œ ๋˜ ๋ฐ”๋€Œ์—ˆ๋„ค์š”! ์ด์ œ ๋””์ฝ”๋”ฉ๋œ ๋งˆ๋ฒ•๊ธฐ์ˆ ์˜ ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์™€ Error๊ฐ€ ๋‹ด๊ธด Publisher๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๋Š”๊ฑด ์ž์ฃผ ์ผ์–ด๋‚˜๋Š” ์ผ์ด์ฃ ? ๊ทธ๋ž˜์„œ ์ €ํฌ๋Š” ์ด ์ž‘์—…์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” decode Operator๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค!

 

๊ฐ„๋‹จํ•˜์ฃ ? (์ด ๊ตฌ๊ฐ„์—์„œ ์‚ฌ๋žŒ๋“ค์ด ๋ง‰ ๋ฐ•์ˆ˜๋ฅผ ์น˜๋Š”๋ฐ ์–ผ๋งˆ๋‚˜ ๋””์ฝ”๋”ฉ์„ ๋‹ค๋“ค ๊ท€์ฐฎ์•„ํ–ˆ๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋˜๋„ค์š”ใ…œใ…œ)

 

Error Handling

์ด์ œ ์šฐ๋ฆฌ์˜ Publisher๋Š” Error๋ฅผ failure๋กœ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Error์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๋” ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

์ปด๋ฐ”์ธ์—์„œ๋Š” ์ž ์žฌ์ ์ธ Failure์— ๋Œ€ํ•ด ์ ์ ˆํžˆ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Publisher์™€ Subscriber๋Š” ๋ชจ๋‘ ์ž์‹ ์ด ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”, ์ž์‹ ์ด ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” Failure์— ๋Œ€ํ•ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•œ ์ด์œ ๋Š” ์Šค์œ„ํ”„ํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปจ๋ฒค์…˜์„ ํ†ตํ•ด ์—๋Ÿฌ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๊ณ ์‹ถ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ํƒ€์ž…๋“ค์ด Failure๋ฅผ Never๋กœ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์—๋Ÿฌ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด์ฃ . ํ•˜์ง€๋งŒ, ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ์ €ํฌ๊ฐ€ ์—๋Ÿฌ์— ๋Œ€์‘ํ•˜๊ณ  ๋‹ค์‹œ ํšŒ๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ Operator๋“ค์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ Operator๋Š” Failure๊ฐ€ ์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก Assertํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด์ œ Publisher์˜ Failure ํƒ€์ž…์€ Never๊ฐ€ ๋˜์ฃ . ์™œ ๊ทธ๋Ÿด๊นŒ์š”?

 

์ด๋ ‡๊ฒŒ Publisher์™€ Subscriber๊ฐ€ ์žˆ๊ณ  ์ค‘๊ฐ„์— assertNoFailure๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. assertNoFailure๋Š” ์ •์ƒ์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ŠคํŠธ๋ฆผ์— ๋“ค์–ด์˜ค๋ฉด subscriber์—๊ฒŒ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ Failure๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด ์–ด๋–จ๊นŒ์š”?

 

์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋žจ์€ ํŠธ๋žฉ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠธ๋žฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ๊ณ ๊ฐ์ด ์›ํ•˜๋Š” ์•ฑ์˜ ๋™์ž‘์ด ์•„๋‹ˆ์ฃ . 

 

๋‹คํ–‰ํžˆ๋„ ์ปด๋ฐ”์ธ๊ณผ Failure์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ Operator๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ค‘์—์„œ๋„ ํŠนํžˆ ์œ ์šฉํ•œ Operator๋Š” catch ์ž…๋‹ˆ๋‹ค! catch๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค์—๊ฒŒ Recovery Publisher๋ฅผ ์ •์˜ํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ›์•„ ๊ธฐ์กด Publisher์—์„œ Failure๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ catch๊ฐ€ ๋™์ž‘ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

assertNoFailure์™€ ๋น„์Šทํ•œ ์ƒํ™ฉ์—์„œ assertNoFailure๋งŒ catch๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. Publisher์—์„œ ์ •์ƒ์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚ด๋ ค์˜ค๋ฉด ์ด๋ฅผ ๊ทธ๋Œ€๋กœ subscriber์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ Failure๊ฐ€ ๋‚ด๋ ค์˜ค๋ฉด, ๊ธฐ์กด์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋˜ Publisher์™€์˜ ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ค€๋น„๋œ Recovery Publisher๋ฅผ ์—ฐ๊ฒฐํ•œ ๋’ค์—, ์ƒˆ๋กœ์šด Publisher์—์„œ ๋ฐœํ–‰ํ•˜๋Š” ๊ฐ’์„ Subscriber์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. catch๋ฅผ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค๋ฅธ Operator๋“ค๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ํด๋กœ์ €๋ฅผ ์ •์˜ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ๋‹ค๋ฅด์ฃ . ์ปด๋ฐ”์ธ์€ ๋ฐœํ–‰ํ•  ๊ฐ’์ด ์ด๋ฏธ ์ •ํ•ด์ ธ์žˆ๋Š” ํŠน๋ณ„ํ•œ Publisher๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ์š”, ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ Just ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Publisher๋Š” ์ ˆ๋Œ€๋กœ ์‹คํŒจํ•˜์ง€ ์•Š๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์ง€๊ธˆ๊นŒ์ง€ ์ž‘์„ฑํ•œ ์ปด๋ฐ”์ธ์˜ ํ๋ฆ„์„ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”? ๋จผ์ € ์šฐ๋ฆฌ๋Š” Notifcation์„ ๋ฐœํ–‰ํ•˜๋Š” Publisher๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  map์„ ํ†ตํ•ด Notification์— ๋“ค์–ด์žˆ๋Š” Data๋ฅผ ๊บผ๋‚ด์„œ output์œผ๋กœ ๋งŒ๋“ค์—ˆ์ฃ . ๊ทธ ์ดํ›„์—๋Š” decode๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์ฝ”๋”ฉํ–ˆ๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ catch๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” Failure์— ๋Œ€ํ•œ ๋Œ€์ฑ…๋„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. 

 

 

๊ทธ๋Ÿฐ๋ฐ ๋ญ”๊ฐ€ ์ด์ƒํ•˜์ง€ ์•Š๋‚˜์š”? catch๊ฐ€ Failure๋ฅผ ๋ฐ›์œผ๋ฉด Upstream์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋˜ ๊ธฐ์กด Publisher์™€์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒ์‹œ์ผœ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋Œ€์ฒด Publisher๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ failure๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋งŒ placeholder๋กœ ๊ฐ’์„ ์ฑ„์šฐ๊ณ , ๋‚˜๋จธ์ง€ ๊ฒฝ์šฐ์—๋Š” ๊ณ„์†ํ•ด์„œ ๊ธฐ์กด Publisher๋กœ ๋ถ€ํ„ฐ ๋งˆ๋ฒ•๊ธฐ์ˆ ์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

๋˜‘๋˜‘์ด ์• ํ”Œ์€ ์—ญ์‹œ ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์œ„ํ•œ Operator๋„ ์ค€๋น„ํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค. FlatMap์ž…๋‹ˆ๋‹ค. FlatMap์€ ์ด๋ฆ„์ฒ˜๋Ÿผ Map๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. FlatMap์€ ๋‚ด๋ถ€์— Publisher๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ subscriber์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋™์ž‘์„ ์•Œ์•„๋ณด์ฃ .

 

Publisher์—์„œ ๋ฐœํ–‰ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ flatMap์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค. flatMap์€ ์ƒˆ Publisher์ธ Just๋ฅผ ๋งŒ๋“ค๊ณ  ๋””์ฝ”๋”ฉ, catch๊ณผ์ •์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ๊ฒฐ๊ณผ๋ฅผ Subscriber์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์ด๋ฒˆ์—” ๊ฐ™์€ ์ƒํ™ฉ์—์„œ decode ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ catch๋Š” ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋˜ Recovery Publisher๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๊ณ , ์ด ๊ฐ’์ด Subscriber์—๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด flatMap๊ณผ ๊ธฐ์กด Publisher์™€์˜ ์—ฐ๊ฒฐ์€ ์—ฌ์ „ํžˆ ๋‚จ์•„์žˆ๊ธฐ ๋•Œ๋ฌธ์— catch๋งŒ์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. 

 

์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. map operator๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์—ˆ๋˜ Publisher์— flatMap์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํด๋กœ์ €์˜ ์ธ์ž๋กœ map์œผ๋กœ ๋งŒ๋“  Publisher์˜ output์ด ๋“ค์–ด๊ฐ€๊ฒ ์ฃ . ์ด ๊ฐ’์„ Just์— ์ „๋‹ฌํ•˜๊ณ  Just๋Š” ๊ธฐ์กด์— ์ •์˜ํ–ˆ๋˜ decode์™€ catch๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ ˆ๋Œ€๋กœ Fail ํ•˜์ง€ ์•Š๋Š”, Never๋ฅผ Failure๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒ ์ฃ !

 

์ปด๋ฐ”์ธ์„ ์‚ฌ์šฉํ•œ ์•ฑ์„ ๊ณ„์† ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค!

์ด์ œ ์˜ค๋ฅ˜ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” ๋๋‚ฌ์œผ๋‹ˆ, ๊ณ„์†ํ•ด์„œ ๋งˆ๋ฒ•๊ธฐ์ˆ ์„ ๋‹ค์šด๋กœ๋“œ๋ฐ›๋Š” ์•ฑ์„ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ์ด์ œ Publisher(for) Operator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งˆ๋ฒ•๊ธฐ์ˆ ์˜ ์ด๋ฆ„์„ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

Scheduled Operators

์ด ์‹œ์ ์—์„œ ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜์˜ Operator์ธ Scheduler Operator์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ˜„์‹ค์„ธ๊ณ„์—์„œ ์Šค์ผ€์ค„๋ง์„ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์–ธ์ œ, ์–ด๋””์„œ ํŠน์ •ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด Operator๋“ค์€ RunLoop์™€ DispatchQueue์— ์˜ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. 

 

Scheduler Operator๋“ค์„ ์‚ฌ์š”ํ•˜๋ฉด delay์ฒ˜๋Ÿผ ์–ด๋–ค ์ด๋ฒคํŠธ๋ฅผ ๋ฏธ๋ž˜์˜ ์–ด๋–ค ์‹œ์ ๊นŒ์ง€ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ๋„ ํ•˜๊ณ , throttle ์ฒ˜๋Ÿผ ์ด๋ฒคํŠธ์˜ ์ „๋‹ฌ์„ ์ผ์ •ํ•œ ์†๋„ ์ด์ƒ์œผ๋กœ ํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ receive ๊ฐ™์€ Operator๋ฅผ ํ†ตํ•ด์„œ downstream ์ด๋ฒคํŠธ๊ฐ€ ํŠน์ •ํ•œ ์Šค๋ ˆ๋“œ๋‚˜ ํ๋กœ ์ „๋‹ฌ๋˜๋„๋ก ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๋Š” receive operator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์–ป์€ ๋งˆ๋ฒ•๊ธฐ์ˆ ์˜ ์ด๋ฆ„์ด ํ•ญ์ƒ ๋ฉ”์ธ ํ๋กœ ์ „๋‹ฌ๋˜๋„๋ก ์ง€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ ์šฐ๋ฆฌ์˜ Publisher chain์ด ์™„์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ์•„๊นŒ์— ์ด์–ด publisher for๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ํŠน์ •ํ•œ ํ‚ค์— ๋Œ€ํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ ๊ฐ’์„ ๋ฉ”์ธ ํ์— ์ „๋‹ฌํ•ด์„œ UI์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ Publisher๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ Operator๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  chaining์„ ํ†ตํ•ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋กœ ๋ณด๋‚ด๋Š” ์ž‘์—…๊นŒ์ง€ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ ˆ๋ฐ˜ ์ •๋„ ์™”๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ผ๋‹จ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ Subscriber ํŽธ์œผ๋กœ ๋‚˜๋จธ์ง€ ๋‚ด์šฉ๋“ค์„ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค~!