[Combine] Subscriber
์์ํ๊ธฐ ์ ์
์ค๋์ ๋ด์ฉ์ ์ ๋ฒ ํฌ์คํ ์ ๋ด์ฉ๊ณผ ๊ฒน์น๋ ๋ถ๋ถ์ด ๊ฝค ์์ด์! ๋ง์ฝ [Combine] Publisher ํธ์ ์ฝ์ง ์์ผ์ จ๋ค๋ฉด ์ฝ๊ณ ์ค์๋๊ฑธ ๊ถํด๋๋ ค์!๐ค
Subscriber
์ ๋ฒ ํฌ์คํ
์์๋ Publisher
๋ฅผ ์์๋ดค์ผ๋ ์ด์ Subscriber
์ ๋ํด ์์๋ณผ ์ฐจ๋ก์
๋๋น. ๊ณต์ ๋ฌธ์๋ฅผ ๋ณผ๊น์?
Publisher์์ ๋์ค๋ ์์์ ํ๋ฆ์ ๋ฐ๋๋ค.
์ ๋ฒ ํฌ์คํ
์ ๊ทธ๋ฆผ์ ๋ค์ ํ๋ฒ ๊ฐ์ ธ์ ๋ด
์๋ค๐ ์ค๋ช
๋๋ก Publisher
์์ ๋์ค๋ ๊ฐ๋ค์ Subscriber
๊ฐ ๋ฐ๊ณ ์๋ค์ฉ. ํ๋์ Publisher
์์ ๋ฐฉ์ถํ๋ ๊ฐ์ ์ฌ๋ฌ๊ฐ์ Subscriber
๊ฐ ๋ฐ์ ์ ์๋ต๋๋ค.
Publisher<Int, Never>
๋ ๋ญ๋ฅผ ๋ปํ๋ค๊ณ ํ์ง ๊ธฐ์ตํ์๋์? ๋ฐ๋ก Publisher
์ Output
๊ณผ Failure
ํ์
์ ๋ํ๋ธ๋ค๊ณ ํ์ด์. (ํท๊ฐ๋ฆฐ๋ค๋ฉด ๊ผญ ์ฌ๊ธฐ์์ ๊ธ์ ์ฝ๊ณ ์ค์ธ์!!)
Publisher
์์๋ Output
๊ณผ Failure
๊ฐ ์๋ฏ์ด, Subscriber
์๋ Input
๊ณผ Failure
๊ฐ ์๋ต๋๋ค.
Publisher
- Output :
publisher
๊ฐ ๋ฐฉ์ถํ๋ ๊ฐ์ ์ข ๋ฅ - Failure :
publisher
๊ฐ ๋ฐฉ์ถํ ์ ์๋ ์๋ฌ์ ์ข ๋ฅ
Subscriber
- Input :
subscriber
๊ฐ ๋ฐ๋ ๊ฐ์ ์ข ๋ฅ - Failure :
subscriber
๋ฐ์ ์ ์๋ ์๋ฌ์ ์ข ๋ฅ
๋ฐ๋ผ์Subscriber
์ Input
&Failure
์ associated type
์ publisher
์ Output
&Failure
ํ์
๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค. ๋น์ฐํ ์ด์ผ๊ธฐ์ฃ ???
์ฌ๊ธฐ๊น์ง๋ ๋ค Publisher ํฌ์คํ ์์ ๊ฐ์ด ์ค๋ช ํ ๋ด์ฉ์ด์์.
Protocol
Subscriber
protocol์๋ ์์์ ์ค๋ช
ํ Input
, Failure
์ธ์๋ 3๊ฐ์ ๋ฉ์๋๊ฐ ์ ์๋์ด ์์ด์! publisher
๋ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ์ด ํจ์๋ค์ ์ฌ์ฉํ๋ ๊ฒ์ด๊ณ ์. ์ข ๋ ์์ธํ ์์๋ณผ๊น์?
receive(subscription:)
susbcriber
์ publisher
์ ์ฐ๊ฒฐํ๊ธฐ ์ํดsubscribe(_:)
ํจ์๋ฅผ ๋ถ๋ฅด๊ณ ๋ ๋ค์ publisher
๊ฐ ํธ์ถํ๋ ํจ์์
๋๋ค. ์ด ํจ์์์๋ subscriber
์๊ฒ Subscription
์ธ์คํด์ค๋ฅผ ์ ๋ฌํด์ค๋๋ค!
Subscription
์ subscriber
์publisher
์ ์ฐ๊ฒฐ์ ๋ํ๋
๋๋ค! ์ด๊ฒ์ ํตํด์ subscriber
์ publisher
์ elements
๋ฅผ ์๊ตฌํ๊ฑฐ๋, ์๋ ์ฝ๋์ฒ๋ผ ๋ ์ด์ ๊ฐ์ ๋ฐ์ง ์๊ฒ ๋ค๊ณ ํ ์๋ ์์ด์~
subscription.cancel()
์ด๋ ๊ฒ subscription
์ ๋ช
์์ ์ผ๋ก ์ทจ์ํ์ง ์์๋ฉด publisher
๊ฐ ์๋ฃ๋ ๋๊น์ง ๋๋ ์ผ๋ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ก ์ธํด ์ ์ฅ๋ subscription
์ด ์ด๊ธฐํ ๋์ง ์์๋๊น์ง ๊ณ์ ์ ์ง๋๋ต๋๋ค.
receive(_:)
subscriber
์ ์ฒซ๋ฒ์งธ ์์ฒญ(initial demand)์ด ์ด๋ค์ง๊ณ ๋๋ฉด publisher
๊ฐ ์๋กญ๊ฒ ๋ฐํ๋ element
๋ค์ subscriber
๋ก ์ ๋ฌํ๊ธฐ ์ํด์ ํธ์ถํ๋ ํจ์์
๋๋ค.
์ด๋ subscriber
์ ์ฒซ๋ฒ์งธ ์์ฒญ์ด๋ subscriber
๊ฐ Subscription
protocol์ ์ ์๋ request(_:)
๋ฅผ ํธ์ถํ๋ ํ์๋ฅผ ๋ปํด์. (์๋ง!ใ
ใ
)
receive(completion:)
subscriber
์๊ฒ ์ด๋ฒคํธ ๋ฐฉ์ถ(publishing)์ด ์ ์์ ์ผ๋ก ๋๋ฌ๋์ง ๋๋ ์๋ฌ๋ก ์ธํด ๋๋ฌ์์ ์๋ ค์ค๋ ํธ์ถ๋๋ ํจ์์
๋๋ค. ์ฌ๊ธฐ์ ํ๋ผ๋ฏธํฐ ํ์
์ Subscribers.Completion
์
๋๋น.
Subscriber ๋ง๋ค๊ธฐ
Subscriber
๋ฅผ ์์๋ฐ์ ์์ ๊ฐ์ ํจ์๋ค์ ์ง์ ๊ตฌํํ ์๋ ์๊ฒ ์ง๋ง ์ฐ๋ฆฌ์ ์ ํ์ ์ด๋ ๊ฒ ์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ๋์ Combine
์ Publisher
ํ์
์ operator๋ฅผ ํตํด ์๋์ ๊ฐ์ subscriber
์ ์ ๊ณตํ๊ณ ์์ด์! ๐ฅณ
sink(receiveCompletion:receiveValue:)
: ์ข ๋ฃ ์๊ทธ๋์ ๋ฐ๊ฑฐ๋ ๋งค๋ฒ ์๋ก์ด ์์๋ฅผ ๋ฐ์์๋ ์์์ ์ธ closure์ ์คํํ๋ค.assign(to:on:)
: ๋งค๋ฒ ์๋ก ๋ฐ์ ๊ฐ์ ์ฃผ์ด์ง ์ธ์คํด์ค์ key path๋ก ์ ์๋๋ property์ ํ ๋นํ๋ค.
ํ์ง๋ง ์ด๋ฐ ๊ฒ๋ค์ ์ผ๋จ ์ ์ณ๋๊ณ ์ง์ ๊ตฌํ์ ํตํด์ ์๋ฆฌ๋ถํฐ ์์๋ณด๋๋ก ํฉ์๋ค! ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์กฐ์ ธ๋ณด์!
๋ง๋ฌด๋ฆฌ
๋ค์ ์๊ฐ์๋ Subscriber
๊ฐ ์ด๋ป๊ฒ Publisher
์์ ๋์จ ๊ฐ์ ๋ฐ๋์ง์ ๋ํด ์ข ๋ ์์ธํ ์ค๋ช
๊ณผ ์์๋ฅผ ํตํด ์์๋ณด๋๋ก ํฉ์๋ค. ๊ทธ๋ผ ๋ค์ ์๊ฐ์ ๋ง๋์!