์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค:)
์ง๋ ๊ธ์์ Combine์ ํต์ฌ์ด์ ๊ธฐ๋ณธ์ธ Publisher, Subscriber์ ๋ํด ๊ณต์ ๋ฌธ์๋ฅผ ํ ๋๋ก ์ ๋ฆฌํด๋ณด์๋๋ฐ์,
Combine์ ๋ํด ๋ ๊น๊ฒ ํ์ตํ๊ธฐ์ ์์ WWDC19 - Introducing Combine ์์์ ๋ณด๊ณ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
ํด๋น ์ธ์ ์์๋ Publisher, Subscriber, Operator ์ ๋ํด ๊ฐ๊ด์ ์ธ ๋ด์ฉ์ ๋ด๊ณ ์์ด Combine ํ๋ ์์ํฌ์ ๋ํด ํ ๋ฒ ํ์ด๋ณผ ์ ์์๋ ์ธ์ ์ด์์ต๋๋ค.
Combine์ด๋?
A unified declarative API for processing values over time.
Combine์ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ํตํฉ๋ ์ ์ธ์ API์ ๋๋ค.
Key Concepts
- Publishers
- Subscribers
- Operators
Publisher
- Publisher๋ Combine API์ ์ ์ธ์ ๋ถ๋ถ
- ๊ฐ๊ณผ ์ค๋ฅ๊ฐ ์์ฑ๋๋ ๋ฐฉ์์ ์ค๋ช ํจ(์ค์ ๋ก ๋ฐ๋์ ์์ฑํ๋ ๊ฒ์ X)
- ๊ฐ ํ์ (=๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉ)
- Subscriber(=์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ฐ์ ๋ฐ๋ ๊ฒ) ๋ฑ๋ก์ ํ์ฉ
๋ ๊ฐ์ associated type์ ๊ฐ์ง๊ณ ์์
- Output: ์์ฑ๋๋ ๊ฐ์ ์ข ๋ฅ
- Failure: ์์ฑ๋๋ ์ค๋ฅ์ ์ข ๋ฅ
- Publisher๊ฐ ์ค๋ฅ๋ฅผ ์์ฑํ ์ ์๋ ๊ฒฝ์ฐ never ํ์ ์ฌ์ฉ ๊ฐ๋ฅ
- Publisher์ ํต์ฌ๊ธฐ๋ฅ: Subscribe
- Subsribe์์๋ Subsriber์ Input์ด Publisher์ Output๊ณผ ์ผ์นํ๊ณ , Subsriber์ Failure์ด Publisher์ Failure๊ณผ ์ผ์นํด์ผ ํจ
Example of Publisher - NotificationCenter
NotificationCenter๋ฅผ ์ํ Publisher
- ๊ตฌ์กฐ์ฒด๋ก ์ ์
- Ouput ํ์ ์ Notification
- Failure ํ์ ์ Never
- center, name, object ์ธ๊ฐ์ง ํญ๋ชฉ์ผ๋ก ์ด๊ธฐํ ๋จ
Subscriber
- Subscriber๋ Publisher์ ๋์๋๋ ๊ฐ๋
- Publisher๊ฐ ์ ํํ ๊ฒฝ์ฐ completion์ ํฌํจํ ๊ฐ์ ๋ฐ๋ ๊ฒ
- ์ฐธ์กฐ ํ์ (์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ์์ ํ๋ฉด ๋์ํ๊ณ , ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ. class๋ก ๊ตฌํ๋จ)
- ๋ ๊ฐ์ง associatedtype ์กด์ฌ (Input, Failure)
- Publisher์ ๋ง์ฐฌ๊ฐ์ง๋ก Subscriber๊ฐ Failure๋ฅผ ์์ ํ ์ ์๋ ๊ฒฝ์ฐ Never ํ์ ์ฌ์ฉ๊ฐ๋ฅ
- ์ธ ๊ฐ์ง ์ฃผ์ ๊ธฐ๋ฅ
- ๊ตฌ๋ ์ ๋ฐ์ ์ ์์(๊ตฌ๋ ์ subscriber๊ฐ publisher์์ subscriber๋ก์ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ์ดํ๋ ๋ฐฉ๋ฒ)
- Input์ ๋ฐ์ ์ ์์
- ์ฐ๊ฒฐ๋ publisher๊ฐ ์ ํํ ๊ฒฝ์ฐ, ์๋ฃ(Finished) ๋๋ ์คํจ(Failure)์ผ ์ ์๋ Completion์ ๋ฐ์ ์ ์์
Example of Subscriber
- Assign์ ํด๋์ค๋ก ์ ์๋จ
- ํด๋์ค ์ธ์คํด์ค, ๊ฐ์ฒด ์ธ์คํด์ค, ๊ทธ๋ฆฌ๊ณ ํด๋น ๊ฐ์ฒด์ ๋ํ ์ ํ ์์ ํค ๊ฒฝ๋ก(type safe key path)๋ก ์ด๊ธฐํ ๋จ
- ํด๋น ํด๋์ค๊ฐ ํ๋ ์ผ์ ์ ๋ ฅ์ ๋ฐ์ผ๋ฉด ํด๋น ๊ฐ์ฒด์ ํ๋กํผํฐ์ Input์ write ํ๋ ๊ฒ
- ํ๋กํผํฐ ๊ฐ๋ง writeํ ๋ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ Assign์ Failure ํ์ ์ Never๋ก ์ค์ ํจ
The Pattern (๋์ ๋ฐฉ์)
Subscriber๋ฅผ ๋ณด์ ํ๋ ์ผ์ข ์ ์ปจํธ๋กค๋ฌ ๊ฐ์ฒด๋ ๋ค๋ฅธ ํ์ ์ด ์์ ์ ์์ผ๋ฉฐ, ์ด๋ Subsribe๋ฅผ ํธ์ถํ์ฌ Subscriber๋ฅผ Publisher์๊ฒ ์ฐ๊ฒฐํ๋ ์ผ์ ๋ด๋นํ๊ฒ ๋ฉ๋๋ค.
์ด ์์ ์์ Publisher๋ Subscriber๊ฐ Publisher์๊ฒ ํน์ ์์ ๊ฐ ๋๋ ๋ฌด์ ํ์ ์์ฒญํ๋ ๋ฐ ์ฌ์ฉํ ๊ตฌ๋ (subscription)์ Subscriber์๊ฒ ๋ณด๋ ๋๋ค.
๊ทธ๋ฌ๋ฉด, Publisher๋ ํด๋น ์ ์ดํ์ ๊ฐ์ Subscriber์๊ฒ ์์ ๋กญ๊ฒ ๋ณด๋ผ ์ ์๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Publisher๊ฐ ์ ํํ ๊ฒฝ์ฐ์๋ ๋ง์ง๋ง์ ์๋ฃ(Completion) ๋๋ ์ค๋ฅ(Error)๋ฅผ ์ ์กํ๊ฒ ๋จ
→ ์์ฝํ์๋ฉด, ํ๋์ ๊ตฌ๋ , 0๊ฐ ์ด์์ ๊ฐ ๋ฐ ๋จ์ผ ์๋ฃ
์์ ๋ก ๋ด ์๋ค!
Wizard๋ผ๋ ๋ชจ๋ธ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ด์ฌ์ ๋๋ ๊ฒ์ 'Wizard๊ฐ ์ด๋ค ํ๋ ์ ์ํด ์๋์ง' ์ ๋๋ค.
5ํ๋ ์ธ merlin๋ถํฐ ์์ํด๋ด ์๋ค. ์ํ๋ ๊ฒ์ ํ์๋ค์ ์กธ์ ์ ๋ํ ์๋ฆผ์ ์์ ํ๋ ๊ฒ์ ๋๋ค.
์ฆ, ํ์๋ค์ด ์กธ์ ํ๋ฉด ๋ชจ๋ธ ๊ฐ์ฒด์ ๊ฐ์ ์ ๋ฐ์ดํธํด๋ด ์๋ค.
Merlin์ ์กธ์ ์ ๊ดํ default ์ผํฐ์ NotificationCenter Publisher๋ฅผ ๋ฑ๋กํ๋ ๊ฒ๋ถํฐ ์์ํฉ๋๋ค.
๋ค์์ผ๋ก Assign Subscriber๋ฅผ ์์ฑํ๊ณ , Merlin์ ํ๋ ํ๋กํผํฐ์ ์๋ก์ด ํ๋ ์ ์ฐ๋๋ก ์ง์ํฉ๋๋ค.
๊ทธ ๋ค์, subscribe๋ฅผ ์ฌ์ฉํ์ฌ publisher์ subscriber๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
ํ์ง๋ง, ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์๋ํ๋ฉด ํ์ ์ด ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ด์ฃ !
NotificationCenter๋ ์๋ฆผ์ ๋ณด๋ด์ง๋ง Interger ํ์ ์ ํ๋กํผํฐ์ ์ฐ๋๋ก ๊ตฌ์ฑ๋ Assign์๋ Intํ์ ์ ์ ์๊ฐ ํ์ํฉ๋๋ค.
→ notification๊ณผ integer ์ฌ์ด์์ ๋ณํํ๋ ๋ฌด์ธ๊ฐ๊ฐ ํ์ํ๋ค! ์ฆ, ์ฐ์ฐ์(operator)๊ฐ ํ์ํ ๊ฒ!!
Operator
- Publisher ํ๋กํ ์ฝ์ ์ฑํ → ์ผ์ข ์ Publisher์ธ ๊ฒ
- ๊ฐ ํ์ (์ ์ธ์ ์ด๊ธฐ ๋๋ฌธ)
- ๊ฐ ๋ณ๊ฒฝ, ๊ฐ ์ถ๊ฐ, ๊ฐ ์ ๊ฑฐ ๋๋ ์ฌ๋ฌ๊ฐ์ง ๋ค์ํ ์ข ๋ฅ์ ๋์์ ์ค๋ช ํ๋ ์ญํ ์ ํจ
- ๋ํ, Publisher(upstream)๋ฅผ ๊ตฌ๋ ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Subscriber(downstream)์๊ฒ ๋ณด๋
Example of Operator - Map
- Map์ upstream์ ์ฐ๊ฒฐํ๊ณ , upstream์ ์ถ๋ ฅ์ ์์ฒด์ ์ธ ์ถ๋ ฅ์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ด๊ธฐํ๋๋ ๊ตฌ์กฐ์ฒด
- ์์ฒด์ ์ผ๋ก Failure๋ฅผ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์ upstream์ Failure ์ ํ์ ๋จ์ํ ๋ฏธ๋ฌ๋งํ๊ณ ํต๊ณผ์ํด
๋ฐ๋ผ์ Map์ ์ฌ์ฉํ๋ฉด ์๋ฆผ๊ณผ ์ ์ ์ฌ์ด๋ฅผ ๋ณํํ ์ ์๋ ๋๊ตฌ๊ฐ ์กด์ฌํ๊ฒ ๋๋ ๊ฒ!
map ํด๋ก์ ๋ก ์๋ฆผ์ ๋ฐ๊ณ Int ํ์ ์ผ๋ก ๋ณํ์ ํด์ฃผ๊ณ ์์ต๋๋ค.
๋ณํ ์ฑ๊ณต == subsriber์ ์ฐ๊ฒฐ ์ฑ๊ณต
์์ ๊ฐ์ด Generic๊ณผ ํ๋กํ ์ฝ extension์ ํ์ฉํด ๋ชจ๋ Publisher๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค ์ ์์ต๋๋ค.
Publisher์ extension์ผ๋ก ์ ์ํ๊ธฐ ๋๋ฌธ์ self๋ฅผ ์ฌ์ฉํ ์ ์์ด ์ฝ๋๊ฐ ์ข ๋ ๊ฐ๋จํด์ง๋๋ค.
์๋ฆผ(=notification)์ ๋ฐ์ผ๋ฉด map ํด๋ก์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๋งคํํ ๋ค์ Merlin์ grade ํ๋กํผํฐ์ ํ ๋นํฉ๋๋ค.
ํด๋น ๊ตฌ๋ฌธ์ ๋จ๊ณ๋ณ๋ก ์ผ์ด๋๋ ์ผ์ ๋ํด ๋งค์ฐ ์ ํ์ ์ด๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ํ๋ฆ์ ์ ๊ณตํฉ๋๋ค.
Assign์ Cancelable์ ๋ฐํํฉ๋๋ค.
์ฆ, ์ทจ์ ๊ธฐ๋ฅ(cancelation)๋ combine์ ๋ด์ฅ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
์ทจ์(cancelation)๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ํ ๊ฒฝ์ฐ publisher์ subscriber ์ํ์ค๋ฅผ ์กฐ๊ธฐ์ ์ค๋จํ ์ ์์ต๋๋ค.
์์์ ์ดํด๋ณธ ๋จ๊ณ๋ณ ๊ตฌ๋ฌธ(step-by-step syntax)์ Combine ์ฌ์ฉ๋ฐฉ๋ฒ์ ํต์ฌ์ด๋ค.
๊ฐ ๋จ๊ณ๋ ์ฒด์ธ์ ๋ค์ ๋ช ๋ น ์ธํธ๋ฅผ ์ค๋ช ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ publisher ์์ ์ผ๋ จ์ ์ฐ์ฐ์๋ค์ ๊ฑฐ์ณ subscriber๋ก ๋๋๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ๋ณํํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ํ ์ฐ์ฐ์๋ค์ด ์กด์ฌํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ์ ์ธ์ ์ฐ์ฐ์ API(Declarative Operator API)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
- ๊ธฐ๋ฅ์ ๋ณํ - ex. map
- ๋ฆฌ์คํธ ์ฐ์ฐ - ex. filter, reduce ..
- ์ค๋ฅ ์ฒ๋ฆฌ - ์ค๋ฅ๋ฅผ ๋ํดํธ ๊ฐ์ด๋ ๋์ฒด ๊ฐ์ผ๋ก ๋ฐ๊ฟ
- ์ค๋ ๋ ๋๋ ํ ์ด๋ - ex. ๋ฌด๊ฑฐ์ด ์ฒ๋ฆฌ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์ด๋ํ๊ฑฐ๋ UI ์์ ์ ๋ฉ์ธ ์ค๋ ๋๋ก ์ด๋
- ์ค์ผ์ค๋ง ๋ฐ ์๊ฐ - ๋ฃจํ, ๋์คํจ์น ํ, ํ์ด๋จธ ์ง์, ํ์์์ ๋ฑ๊ณผ์ ํตํฉ์ ํฌํจ
์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์์ ์ข ๋ฅ๊ฐ ๋งค์ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ด๋ค ๊ฒ์ ์ฌ์ฉํ ์ง ํ๋จํ๋ ๊ฒ์ด ๋ค์ ๋ถ๋ด์ค๋ฌ์ธ ์ ์์ต๋๋ค.
์ด๋ด ๋, ํ๋จ ๊ธฐ์ค์ Combine์ ํต์ฌ ๋์์ธ ์์น, ์ฆ Composition์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ ๊ถํ๋ค๊ณ ํฉ๋๋ค.
์ ํ์์๋ ๋ง์ ์ผ์ ํ๋ ๋ช๋ช ์ฐ์ฐ์๋ฅผ ์ ๊ณตํ๋ ๋์ , ๊ฐ๊ฐ ์กฐ๊ธ์ฉ๋ง ์ํํ๋ ๋ง์ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํ์ฌ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์์ผ๋ฉฐ,
๊ฐ๋ฐ์๋ค์ด ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก Swift Collection API์์ ์ด๋ฆ์ ๋ง์ด ๋ฐ์๋ค๊ณ ํ๋ค์!
์ผ์ชฝ์๋ Synchronous(๋๊ธฐ) API๊ฐ ์๊ณ ์ค๋ฅธ์ชฝ์๋ Asynchronous(๋น๋๊ธฐ) API๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ชฝ์๋ ๋จ์ผ ๊ฐ, ์๋์ชฝ์๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ด ์์ต๋๋ค.
Swift์์ ํ๋์ ์ ์๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ๊ฒฝ์ฐ์ Int๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ง๋ง Combine์ ์ฌ์ฉํด์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด Future๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋ํ, ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๋๊ธฐ๋ก ์ฌ์ฉํ ๋๋ Array, ๋น๋๊ธฐ๋ก ์ฌ์ฉํ ๊ฒ์ด๋ผ๋ฉด Publisher๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ํฉ๋๋ค.
์์๋ก ๋ด ์๋ค.
Example of Operator - CompactMap, filter
์์ ์์ ์ฝ๋๋ key๊ฐ ์๊ฑฐ๋ ์ ์๊ฐ ์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ 0์ ์ฌ์ฉํ๋ ์ฝ๋์ ๋๋ค.
์ด ์๋ชป๋ ๊ฐ์ด ์งํ๋์ด ๋ชจ๋ธ ๊ฐ์ฒด์ ๊ธฐ๋ก๋๋ ๊ฒ์ ํ์ฉํ์ง ์๋ ๊ฒ์ด ๋ ๋์ ์์ด๋์ด์ผ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ด ํด๋ก์ ๊ฐ nil์ ๋ฐํํ๋๋ก ํ์ฉํ ๋ค์, nil ๊ฐ์ ํํฐ๋งํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
Swift 4.1์์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํด๋น ์์ ์ ๋ํ ์ด๋ฆ์ ๋์ ํ์ต๋๋ค. ์ด๋ฅผ CompactMap์ด๋ผ๊ณ ํฉ๋๋ค.
Publisher์๋ CompactMap์ด ์์ต๋๋ค. ์ด๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ CompactMap๊ณผ ๋น์ทํ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
ํด๋ก์ ์์ nil์ ๋ฐํํ๋ฉด CompactMap์ ์ด๋ฅผ ํํฐ๋งํ์ฌ ์คํธ๋ฆผ ์๋๋ก ๋ ์ด์ ์งํ๋์ง ์๋๋ก ํฉ๋๋ค.
๋ช๊ฐ์ง ์น์ํ ์ด๋ฆ๋ค์ ์ฌ์ฉํ์ฌ ๋จ๊ณ๋ณ ์ง์นจ์ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
ํ๊ต์๋ 5ํ๋ ์ด์์ ํ์๋ค๋ง ์ ํ์ด ํ์ฉ๋๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
filter๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค.
filter๋ ์ค์ง ํด๋น ์กฐ๊ฑด์ ํต๊ณผํ๋ ์์๋ง ๊ณ์ ์งํํ๋๋ก ํ์ฉํฉ๋๋ค.
์ด๋ Array์ filter์ ์ ํํ ๋์ผํ ๋์์ ๋๋ค.
์ฌ๊ธฐ๋ค๊ฐ ์กธ์ ์ ์ต๋ 3๋ฒ๊น์ง๋ง ํ์ฉ๋๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
๋ฐฐ์ด์์ ์ฒ์ ์ธ ์์๋ฅผ ๊ฐ์ ธ์์ผํ๋ ๊ฒฝ์ฐ prefix(3)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
publisher์์๋ ์ฒ์ ์ธ ์์๋ง ๋ฐ์ผ๋ ค๋ฉด prefix(3)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ํ๋ ์ผ์ ์ธ ๊ฐ์ ๊ฐ์ ๋ฐ์ ํ ์ ์คํธ๋ฆผ์ ์ทจ์ํ๊ณ ๋ค์ด์คํธ๋ฆผ์ผ๋ก ์๋ฃ๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ๋๋ค.
map, filter๋ ํ๋ฅญํ API์ด์ง๋ง ์ฃผ๋ก ๋๊ธฐ ๋์์ ์ํ ๊ฒ์ ๋๋ค. Combine์ ๋น๋๊ธฐ ์ธ๊ณ์์ ์์ ํ ๋ ๋น์ ๋ฐํ๊ธฐ ์์ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ ๋ง ์ ์ฉํ ์ ์๋ ๋ ๊ฐ์ง ์ฐ์ฐ์์ ๋ํด ์ดํด๋ด ์๋ค.
Example of Operator - zip, combineLatest
1. Zip
- ์ฌ๋ฌ ์ ์คํธ๋ฆผ ์ ๋ ฅ์ ๋จ์ผ ํํ๋ก ๋ณํํด์ ๋ค์ด์คํธ๋ฆผ์ผ๋ก ์ ๋ฌ
- when/and ์์ ์ผ๋ก ๋ง๋ฆ - downstream์ผ๋ก ์ ๋ฌํ๊ธฐ ์ํด์๋ tuple์ ๋ชจ๋ ๊ฐ์ด ์ ๋ ฅ๋์ด์ผ ํ๋ฏ๋ก upstream์ ๋ชจ๋ input์ด ์ ๋ฌ๋ ํ์ downstream์ผ๋ก tuple์ ์ ๋ฌํ ์ ์๊ฒ ๋จ
- ์ฆ, ๊ณ์ ์งํ๋๋ ค๋ฉด ๋ชจ๋ upstream input๊ฐ์ด ์ ๋ฌ๋์ด์ผ๋ง
์์๋ก zip ์ ๋์์ ์ดํดํด๋ณด์๋ฉด,
3๊ฐ์ ์ ์คํธ๋ฆผ์ด ํ์ํ zip์ ์ฌ์ฉํ์ฌ 3๊ฐ์ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋์ด์ผ ๋ค์ด์คํธ๋ฆผ์ผ๋ก ๊ฐ์ ์ ๋ฌํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
๊ฐ๊ฐ bool ํ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ 3๊ฐ์ ๋น๋๊ธฐ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ , ๋ชจ๋ ์๋ฃ๋๋ฉด ๊ฐ์ ๋ฒํผ์ isEnabled ์์ฑ์ ๋ฃ์ ์ ์๋๋ก ๋งคํํจ์ผ๋ก์จ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ด ๋ชจ๋ ๋ง์กฑ๋ ๋๋ง Continue ๋ฒํผ์ ํ์ฑํ ์ํค๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
3. CombineLatest
- zip๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฌ ์ ์คํธ๋ฆผ ์ ๋ ฅ์ ๋จ์ผ ๊ฐ์ผ๋ก ๋ณํ
- ๊ทธ๋ฌ๋ zip๊ณผ๋ ๋ค๋ฅด๊ฒ ์งํํ๋ ค๋ฉด ์
์คํธ๋ฆผ ์ค ์ด๋ ํ๋์ ์
๋ ฅ์ด ํ์ํ๋ฏ๋ก when/or ์์
- ์ ์คํธ๋ฆผ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ค์ด์คํธ๋ฆผ์ผ๋ก ๊ฐ์ ์ ๋ฌ
- ๊ฐ ์ ์คํธ๋ฆผ์์ ๋ฐ์ ๋ง์ง๋ง ๊ฐ์ ์ ์ฅ
- ๊ฐ์ ๋จ์ผ ๋ค์ด์คํธ๋ฆผ ๊ฐ์ผ๋ก ๋ณํํ ์ ์๋ ํด๋ก์ ๋ก ๊ตฌ์ฑ๋จ
3๊ฐ์ ์ ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ CombineLatest๋ฅผ ์ฌ์ฉํ์ฌ ํ ๊ธ ์ค์์น์ ์ํ๊ฐ์ ๋ฐ๋ผ play ๋ฒํผ์ ํ์ฑํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋๋ก ํ ์ ์์ต๋๋ค.
3๊ฐ์ ์ค์์น ๋ชจ๋ bool ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ ์ด๋ฅผ ๋ค์ ๋จ์ผ bool๊ฐ์ผ๋ก ๋ณํํ๊ณ ์ด๋ฅผ play ๋ฒํผ์ isEnabled ์์ฑ์ ๊ธฐ๋กํฉ๋๋ค.
์ฆ, ์ด๋ ํ๋์ ๊ฐ์ด๋ผ๋ false ์ด๋ฉด ๊ฒฐ๊ณผ๋ false์ด๊ธฐ ๋๋ฌธ์ ๋ฒํผ์ด ํ์ฑํ๋์ง ์๊ณ , ๋ชจ๋ true ์ด๋ฉด ๊ฒฐ๊ณผ๋ true ์ด๋ฏ๋ก ๋ฒํผ์ด ํ์ฑํ๋๊ฒ ๋ฉ๋๋ค.
Combine์ ์ฌ์ฉํ๊ธฐ ์ํด์ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ชจ๋ ๋ณํํ ํ์๋ ์์ต๋๋ค.
์ ์ง์ ์ผ๋ก Combine์ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณํ๋ค๊ณ ํ๋ค์! ์์ ๋ก ์ดํด๋ณธ ๊ฒ์ฒ๋ผ ์ฌ๋ฌ ์ํฉ์์ ์ ํฉํ operator๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ, ๋น๋๊ธฐ ์์ ์ค ๊ฐ์ฅ ๋ง์ด ํ๋ ์์ ์ด ๋คํธ์ํน์ธ๋ฐ, URLSession์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ค JSON Decoder๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ decode ์ฐ์ฐ์๋ ์กด์ฌํฉ๋๋ค.
ํด๋น ์์์์๋ Combine์ ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ๋ค๋ง ๋ค๋ฃจ๋๋ฐ, Combine์๋ ๋ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ด ์กด์ฌํฉ๋๋ค!
๋ ์์ธํ ๋ด์ฉ๊ณผ ์์ ์ฝ๋๋ค์ ๋ค๋ฅธ ๊ฒ์๊ธ๋ก ๋ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!!๐๐
'๐ iOS > Combine' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Combine] ๊ด์ฐฐ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๋ง๋ค๊ธฐ - ObservableObject์ @Published (2) | 2024.08.22 |
---|---|
[Combine] Combine ์์ํ๊ธฐ - Publisher์ Subscriber (2) | 2024.03.10 |