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 ๋ฑ์ฅ
Combine์ ์๊ฐ์ ๋ฐ๋ฅธ ๊ฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํตํฉ์ ์ด๊ณ ์ ์ธ์ ์ธ API์ด๋ค.
Combine์ Swift๋ก ์์ฑ๋์ด ์๋๋ฐ, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ๋ค๋ฆญ๊ณผ ๊ฐ์ Swift ๊ธฐ๋ฅ๋ค์ ์ด์ฉํ ์ ์๋ค. ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ฉด ์์ฑํด์ผ ํ๋ boilerplate ์ฝ๋์ ์์ ์ค์ผ ์ ์๋ค.
Combine์ ๋ํ ํ์ ์ธ์ดํ ํ๊ธฐ ๋๋ฌธ์, ๋ฐํ์์ด ์๋ ์ปดํ์ผ ํ์์ ์๋ฌ๋ฅผ ์บ์นํ ์ ์๋ค.
ํต์ฌ ๊ฐ๋ ์ด ๊ฐ๋จํ๊ณ , ์ดํดํ๊ธฐ ์ฝ์ง๋ง, ์ฌ์ฉํ๋ฉด ํฐ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ Combine์ request-driven ํ๊ธฐ ๋๋ฌธ์ ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์ฑ๋ฅ์ ๋ณด๋ค ์ ์คํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
Combine์ ํต์ฌ ๊ฐ๋ ์ 3๊ฐ์ง์ด๋ค.
1๏ธโฃ Publisher 2๏ธโฃ Subscriber 3๏ธโฃ Operator
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์ ์ผ์นํด์ผ ํ๋ค.
๋ค์์ 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์ด๋ค.
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, ํ์ด๋จธ, ํ์์์ ๋ฑ์ ์ค์ผ์ค๋ง๋ ์ ๊ณตํ๋ค.
๋ง์ ์์ ์ ๋ชจ๋ ์ํํ๋ ๋ช ๊ฐ์ 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๊ฐ ์๋ค.
์ถ์ฒ