[Combine] Subject๋ (AnyPublisher)
์ ์ :
publisher, subscriber์ ๊ฐ์ด ํ๋กํ ์ฝ์ด๋ค์ !
๊ทธ๋ฆฌ๊ณ subject๋ ์ฌ์ค publisher๋๋๋ค. subject๋ Publisher ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ send() ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ์ฃผ์ ํฉ๋๋ค.
์ฆ publisher๋ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ์ฃผ์ฒด์๋ค๋ฉด ์ด ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ ์ฃผ์ ํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก subject์ ๋๋ค.
subject๋ ๋ค์๊ณผ ๊ฐ์ด ๋๊ฐ์ง ํด๋์ค๋ก ๊ตฌํ๋ ์ ์์ต๋๋ค.
- PassthroughSubject
- CurrentValueSubject
PassthroughSubject
downstream ๊ตฌ๋ ์๋ค์๊ฒ ์์๋ฅผ ๋ฐฉ์ถํ๋ broadcast ํฉ๋๋ค.
์์๋ฅผ ๋ด ์๋ค.
PassthroughSubject๋ฅผ ๋ง๋ค์ด subscriber1๊ณผ subscriber2๋ฅผ ๋ง๋ค์์ต๋๋ค.
์ด๋ send() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๊ฐ์ ์ฃผ์ ํฉ๋๋ค.
broadcast ํ๋ค๋ ๋ง์ subscriber๊ฐ ์ฌ๋ฟ์ผ๋ ํด๋น subject๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ subscriber์๊ฒ ๊ฐ์ ์ ๋ฌํ๋ค๋ ์๊ธฐ์ ๋๋ค.
//subscriber1 : hey
//subscriber2 : hey
//subscriber1 : uri
//subscriber2 : uri
//subscriber1 : finished
//subscriber2 : finished
๋ง์ฝ subscriber์ ๊ตฌ๋ ์ ์ค๊ฐ์ ์ทจ์ํ๋ค๋ฉด ์์ง ๊ตฌ๋ ์ค์ธ subscriber2์๊ฒ๋ง uri๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ ๋๋ค.
CurrentValueSubject
PassthroughSubject์ ๋ฌ๋ฆฌ ์ด๊ธฐ๊ฐ๊ณผ ์ต๊ทผ ๋ฐํ๋ element์ ๋ํ buffer๋ฅผ ๊ฐ์ต๋๋ค.
์์๋ฅผ ๋ด ์๋ค.
์ด๊ธฐ๊ฐ "Uri"๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ์ต๊ทผ ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
subject๋ ๊ฐ์ ๊ฐ์ง ์๋, ๋ฐํํ ์๋ ์๊ธฐ ๋๋ฌธ์ value์ send๋ฅผ ๊ฐ์ง๋๋ค.
//Uri
//์๋
//ํ์ด
Subject Type ์ญ์
๋ง์ฝ ๋์ด์ ๊ฐ์ ๋ฐํํ์ง ์๊ฒ๋ ํ๋ ค๋ฉด (์ฆ, send()๊ฐ ๋์ด์ ํ์ ์์ ์) subject ํ์ ์ AnyPublisher<Int, Never> ํ์ ์ผ๋ก ๋ฐ๊ฟ์ ์์ต๋๋ค.
let publisher = passthroughSubject.eraseToAnyPublisher()
AnyPublisher
๋ค๋ฅธ Publisher๋ฅผ ๋ํํ์ฌ type ์ญ์ ๋ฅผ ์ํํ๋ Publisher
Publisher์ ๋ ๋ค๋ฅธ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ผ๋ก ์ค์ํ ์์ฑ์ ๊ฐ์ง์ง ์์ ์ ์คํธ๋ฆผ Publisher์ element ๊ฐ์ ์ ๋ฌํ๋๋ฐ ์ฌ์ฉ
swift์์ ํ์ ์ด ์์๋ Any, AnyObject๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ํ์ ์ด ์๋(์ค์ํ์ง ์์์) publisher๋ฅผ ์๋ฏธ
publisher์๋ Just, Fail, subject ๋ฑ ๋ค์ํ ํ์ ์ publisher๊ฐ ์๋๋ฐ ์ด ํ์ ์ ์ง์ ์ฌ์ฉํฉ๋๋ค.