[Combine] Subscribe
์ด์ ํฌ์คํ
์์๋ Publisher
์ Subscriber
์ ๋ํด ์์๋ณด์์ต๋๋ค! ์์ฝ๊ณ ์ค์
จ๋ค๋ฉด ๊ฐ๊ฐ์ ํด๋ฆญํด์ ์ฝ๊ณ ์ค์๋๊ฒ..๋์์ด..๋ ๊ฑธ์..?๐ค
์์..! subscriber
๋ ์ด๋ป๊ฒ publisher
๋ฅผ ๊ตฌ๋
ํ๊ณ ๊ฐ์ ๋ฐ๋๊ฑธ๊น์?
๋ฐ๋กprotocol Publisher
์ ์ ์๋์ด ์๋ subscribe(_:)
ํจ์๋ฅผ ์ด์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ๋ง์ด์ฃ .
์จ~~ ์ด์ subscribe(_:)
ํจ์์ ์ธ์๋ก ๋ค์ด๊ฐ subscriber
๋ publisher
๊ฐ ์์ฐํ๋ ๊ฐ๋ค์ ๋ฐ์ ์ ์๊ฒ ๋์์ต๋๋ค~~ ์ด๋์ ์ฐธ ์ฝ์ฃ ?
ํ์ง๋ง ์ข ๋ ๋ค์ด๊ฐ๋ด ์๋ค. ์ ์์์๋ ์ด๋ค์ผ๋ค์ด ๋ฒ์ด์ง๊ณ ์๋๊ฑธ๊น์?๐ค ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํด๋ณด์์๐ฃ
๋ฐฐ๊ฒฝ
์ดํด๋ฅผ ๋๊ธฐ์ํด ํ์์ ๋์ด์๋ด ์๋ค. ์ ํ๋ธ๋ฅผ ์๋ก ๋ค์ด๋ณผ๊ฒ์.
์์ฆ ๊ฐ์ โ๋ฌ๋ธ์กโ๋์๊ฒ ์ ๋ฌธํด๋ฒ๋ ธ๋คโฆ
๋ณด๋ค๋ณด๋ ์ฐ๋ฐ๋..๋ ธ๋ ๋ ์๋ถ๋ฅด๊ณ โฆใ ใ ใ
์,, ์ ํฌ๋ธ๋ ํ์์?! ๋ฐ๋ก ๊ตฌ๋ ํด์ผ์ง..
์์ผ๋ก ์ฐ๋ฐ๋์ ๋ชจ๋ ๊ฒ..๋์น์ง ์์๊ฑฐ์๋ค..
์ด๋ฐ ์ํฉ์ ์๋์ ๊ฐ์ด ์ ๋ฆฌํ ์ ์์๊ฑฐ์์.
๋ = โ๋ฌ๋ธ์กโ๋์ ๊ตฌ๋ ์ ์ํ๋ ๊ตฌ๋ ์ (subscriber)
๋ฌ๋ธ์ก = ์ปจํ ์ธ ์์ฐ์ (publisher)
๋ด๊ฐ ์ง๊ธ ์ํ๋ ๊ฒ = โ๋ฌ๋ธ์กโ๋ ๊ตฌ๋ (subscribe)
**๋ง๊ฐ ์ฐ๋ฐ๋ ํ๋ณด**
์ฐ๋ฐ๋.. ๋ฌ๋ธ์ก ์น๋ฉด.. ์น ๊ณต์ฃผ ๋ฌ๋ธ์ก๋ง ๋์์ ๋ ์์ํดโฆ ํฐ๋์ด ๊ธฐ์จ๋๋๋ .. ํฐ๋์ด ๋ฏธ์๋๋๋ โฆใ โ๏ธ
๋ง์ฝ ์ธ์ ํํ์ฒ ํ๊ณ ์ถ๋คโฆ ๋๋ง ์๋ ์ข์ ๋ ธ๋ ์๊ณ ์ญ๋ฐ.. ํ๋๋ณ ๋ง๊ธฐ๋ค..ํ๋ ๋ถ๋ค.. ๊ตฌ๋ ..๐..๐์ค์ ๊น์งโฆ! ๐์์ ์ค๋ฐ ๋ฐฑ๋ฒ ๋๋ ค..!!!!!!!!!
๊ณผ์
- ๋จผ์ โ๋ฌ๋ธ์กโ๋(publisher)์๊ฒ ๊ตฌ๋
์ ์์ฒญํด์ผ๊ฒ ์ฃ ? ์ด๋ฅผ ์ํด์ ์์ ์ดํด๋ณด์๋ฏ,
publisher
์ ๋ธ๋ฆฐsubscribe(_:)
ํจ์๋ฅผ ํตํดsubscriber
์ ๊ตฌ๋ ์ ์์ฒญํฉ๋๋ค.
2. subscribe(_:)
์ ๊ตฌํ๋ถ์์๋ receive(subscriber:)
๋ผ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ์ด ํจ์๋ Publisher
๋ผ๋ฉด ๋ชจ๋ ๊ตฌํ(implement)ํด์ผํ๋ ํจ์๋ก์ protocol Publisher
์ ์ ์๋์ด ์์ต๋๋ค.
3. receive(subscriber:)
์์๋ ๋ฌด์์ ํ ๊น์? ๋ฐ๋ก publisher
์ subscriber
์ ์ฐ๊ฒฐํด์ค๋๋ค. ์ด๋ป๊ฒ์? ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์ค๋ช
ํด ๋ณผ๊ฒ์.
- ๊ตฌ๋
์ ์์ฒญํ์ผ๋ฉด ๊ตฌ๋
๊ถ์ด ํ์ํ๊ฒ ์ฃ ? ์ฐ์
subscription
์ ๋ง๋ญ๋๋ค.
- ์ด๋ ๊ฒ ๋ง๋ค์ด์ง
subscription
์subscriber
์๊ฒ ์ ๋ฌํ๊ธฐ ์ํดsubscriber
์receive(subscription:)
์ ํธ์ถํฉ๋๋ค. ํด๋น ํจ์๋protocol Subscriber
์ ์ ์๋์ด ์์ต๋๋ค.
์ด๋ ๊ฒ publisher
์ subscriber
๋ subscription
์ ํตํด ์ฐ๊ฒฐ๋ฉ๋๋ค.
4.receive(subscription:)
์์๋ protocol Subscription
์ ์ ์๋ request(_:)
์ ํธ์ถํ์ฌ ๊ฐ์ ์ต๋๋ก ์ผ๋งํผ ๋ฐ์ ๊ฒ์ธ์ง ์ค์ ํฉ๋๋ค. ํจ์์ parameter type์ด Demand
๋ผ๋๊ฑธ ๊ธฐ์ตํด๋์ธ์ฉ. 5๋ฒ์ ๋ค์ ๋ฑ์ฅํฉ๋๋ค!
protocol Subscription
์ ์ ์๋ ๊ฑธ ๋ณด๋ subscriber
๊ฐ ๋ฐ์ ์ ์๋ ์ต๋ ๊ฐ์๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ subscription
์ ์ญํ ์ธ๊ฐ๋ด๊ฐ? ๋ผ๊ณ ์๊ฐํ ์ ์๊ฒ ์ฃ ? subscription
์ ์ญํ ์ ์ข ๋ ์์ธํ ์ดํด๋ณผ๊น์?
publisher
์์ ์๋ก์ด ๊ฐ์ด ๋ฐ์ํ์ ๋publisher
์subscriber
์ ์ค์ฌํ๊ณsubscriber
๊ฐ ์์ฒญํ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๊ฐ์ ๋ฐ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋คsubscribers
์ ์ ์ง ๋ฐ ํด์ ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค
5.subscriber
์ receive(_:)
๋ฅผ ํตํด publisher
๊ฐ ๋ฐฉ์ถํ๋ ์๋ก์ด ๊ฐ๋ค์ ์ ๋ฌํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ํจ์๋ ์ฌ๋ฌ๋ฒ ํธ์ถ ๋ ์ ์์ต๋๋ค.
๋ฐฉ๊ธ 4๋ฒ์์subscription.request(_:)
๋ฅผ ํตํด subscriber
๊ฐ ๋ฐ์ ์ ์๋ ๊ฐ์ ์ต๋ ๊ฐ์๋ฅผ ์ง์ ํ์์ฃ ? ์ด๋ parameter ํ์
์ด Demand
์ธ๊ฑธ ๊ธฐ์ตํ๋ผ๊ณ ํ์ด์! ์๋๋ฉด receive(_:)
์ ๋ฐํ ํ์
๋ Demand
์ด๊ธฐ ๋๋ฌธ์
๋๋ค! ์ด๋ฅผ ํตํด์ ์ฒ์์ subscriber
๊ฐ ๋ฐ์ ์ ์๋ ์ต๋ ๊ฐ์๋ฅผ ์ ํ๋๋ผ๋ ์ ๊ฐ์ ๋ฐ์ ๋๋ง๋ค ์ต๋ ๊ฐ์ ์กฐ์ ํ ์ ์์ด์! ์๋กญ๊ฒ ์ค์ ํ max
๊ฐ์ด ๊ธฐ์กด์ max
๊ฐ์ ์ถ๊ฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ๊ฐ์ ๋ฐ์ ๋๋ง๋ค ๊ธฐ์กด์ max
๊ฐ์ ๋๋ฆด ์ ์์ง๋ง ์ค์ผ ์๋ ์๊ฒ ์ฃ ?
6. ๋ง์ฝ publisher
๊ฐ ๋ ์ด์ ๊ฐ์ ์์ฑํ์ง ์๊ฑฐ๋ error
๊ฐ ๋ฐ์ํ๋ค๋ฉด subscriber
์ receive(completion:)
์ ํธ์ถ์ ํตํด ์ข
๋ฃ๋ฅผ ์๋ฆฝ๋๋ค.
ํ๋ฆ๋
์ง๊ธ๊น์ง ์ค๋ช ํ ๋ด์ฉ์ ํ๋ฆ๋๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์์~
์กฐ๊ธ ๋ ์ ํํ๋ publisher
์ subscriber
์ฌ์ด์ subscription
์ด ์์ฑ๋๊ณ ๋๋ฉด ์ด๊ฒ์ ๋งค๊ฐ์ฒด๋ก ํด์ ์ดํ์ ๋์๋ค์ด ์ผ์ด๋๋ค๊ณ ๋ณด๋ฉด ๋ ๊ฑฐ ๊ฐ์ต๋๋ค. (์๋ง? ใ
๐ค)
์์ ์ฝ๋
์ข์์! ์ด์ ์ง์ ๊ตฌํํ๋ ์ผ๋ง ๋จ์๊ตฐ์ฌ.. ์ง์ ๊ตฌํ์ ์ข์์ ์ ๋ชจ๋ ๋ผ์ดํ์ฌ์ดํด์ ํ์ธํ ์ ์๋ค๋ ์ ์ด์ ธ~~~~
์ถ๋ ฅ์ ์๋์ ๊ฐ์ด ๋ฉ๋๋ค.
โโโ Example of: Custom Subscriber โโโ
Received value 1
Received value 2
Received value 3
๋์? publisher
๋ 1๋ถํฐ 6๊น์ง ๊ฐ์ ๋ฐฉ์ถํ ํ
๋ฐ ์ ์ธ ๊ฐ ๋ฐ์ ์์ฐํ๋ด?? ๋ฐ๋ก ์ด๊ธฐ ์์ฒญ์์ max
๊ฐ์ ์ง์ ํด์คฌ๊ธฐ ๋๋ฌธ์ด์ฃ !
subscription.request(.max(3))
์ฒ์์ ์ค์ ํ max
๊ฐ์ ์ค๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค?? ํ๋ฉด receive(_:)
ํจ์ ์์ ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋ฉ๋๋ค. ์์์ receive(_:)
๋ฅผ ์ค๋ช
ํ ๋ ์ด๋ฐ ๋ด์ฉ์ด ์์๋ตโ๋๋ค๐๐ป
์ฒ์์
subscriber
๊ฐ ๋ฐ์ ์ ์๋ ์ต๋ ๊ฐ์๋ฅผ ์ ํ๋๋ผ๋ ์ ๊ฐ์ ๋ฐ์ ๋๋ง๋ค ์ต๋ ๊ฐ์ ์กฐ์ ํ ์ ์์ด์! ์๋กญ๊ฒ ์ค์ ํmax
๊ฐ์ด ๊ธฐ์กด์max
๊ฐ์ ์ถ๊ฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ๊ฐ์ ๋ฐ์ ๋๋ง๋ค ๊ธฐ์กด์max
๊ฐ์ ๋๋ฆด ์ ์์ง๋ง ์ค์ผ ์๋ ์๊ฒ ์ฃ ?
๋ฐ๋ผ์ receive(_:)
์ return ๊ฐ์ .none
์์ .unlimited
๋ก ๋ณ๊ฒฝํด๋ณผ๊ฒ์. ์ด๋ฆ์์๋ถํฐ ์์ ์๋ค์ํผ publisher
๊ฐ ์์ฐํ ์ ์๋ ์ต๋๋ก ๋ฐ์๋ฒ๋ฆฌ๊ฒ ๋ค..๋ ์๋ฏธโฆ! (A request for as many values as the publisher can produce.)
func receive(_ input: Int) -> Subscribers.Demand {
print("Received value", input)
return .unlimited
}
์จ๐ง๐ปโโ๏ธ ์ถ๋ ฅ ๊ฒฐ๊ณผ๊ฐ ๋ณํ์ต๋๋ค
โโโ Example of: Custom Subscriber โโโ
Received value 1
Received value 2
Received value 3
Received value 4
Received value 5
Received value 6
Received completion finished
๋ง์ฝ .unlimited
๋ฅผ .max(1)
์ผ๋ก ๋ณ๊ฒฝํ๊ณ ๋ค์ ์คํํ๋ค๋ฉด? ์๋กญ๊ฒ ์ค์ ํ max
๊ฐ์ด ๊ธฐ์กด์ max
๊ฐ์ ์ถ๊ฐ๋๋ค๊ณ ํ์ผ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ๋๋ง๋ค max
๊ฐ์ 1์ฉ ๊ณ์ ๋์ด๋๊ฒ ์ฃ ?? ๋๋ฌธ์ 6๊ฐ ๊ฐ์ด ๋ชจ๋ ์ฐํ๊ฑฐ์์!
๋ง๋ฌด๋ฆฌ
์ด๋ ๊ฒ Subscriber
๋ฅผ ์์๋ฐ์ ์ง์ ๊ตฌํํ custom subscriber ์ ์ด์ฉํด publisher
๋ฅผ ๊ตฌ๋
ํด๋ดค์ด์! ํ์ง๋ง ์ด์ ํฌ์คํ
์์๋ ์ธ๊ธํ๋ฏ์ด ์ ํ์ ์ด๋ฐ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์๋๋ต๋๋ค~ ๋์ Combine
์์๋ Sink
, Assign
๋ฑ์ ๊ธฐ๋ณธ Subscriber
๋ฅผ ์ ๊ณตํ๊ณ ์๊ณ Publisher
protocol์ ์ ์๋ sink
๋ assign
ํจ์๋ฅผ ์ด์ฉํด์ ๊ฐ๊ฐ์ subscription
์ ๊ฐ๋จํ ๊ตฌํํ ์ ์์ด์!
์ง๊ธ๋ ์ถฉ๋ถํ ๊ธ์ด ๊ธด ๊ฒ ๊ฐ์ผ๋..! ์ด ๋ฐฉ๋ฒ๋ค์ ๋ค์ ํฌ์คํ ์์ ์๊ฐํ๊ฒ ์ต๋๋ค. ๊ทธ๋ผ 20000!