[iOS-WWDC2019] Combine ์ฌ์ฉํ๊ธฐ (1) - Publisher
Combine in Practice
์ค๋์ WWDC์์ ๋ฐํ๋ ์ปด๋ฐ์ธ์ ๋ํด ๋ฒ์ญํ๋ฉฐ ๊ณต๋ถํด๋ณด๊ฒ ์ต๋๋ค! ์ค์ญ์ด๋ ์์ญ์ด ์์ ์ ์์ผ๋ ๋ ์์ธํ๊ณ ๋ช ํํ ๋ด์ฉ์ ์๋ ์ธ์ ์์ ํ์ธํด๋ณด์ธ์...! ๊ทธ๋ผ ์์ํฉ๋๋ค~!
์ปด๋ฐ์ธ์ด ๋ญ๋ฐ?
์ฐ๋ฆฌ์ ์ฝ๋์์ ์ฐ๋ฆฌ๋ ์์ฃผ ์ด๋ค ์ด๋ฒคํธ๋ ๊ฐ์ ๋ฐํํ๋ 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 ํธ์ผ๋ก ๋๋จธ์ง ๋ด์ฉ๋ค์ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค~!