[Combine] Subscriber

๊ตฌ๋…๐Ÿ—ž

naljin
6 min readFeb 23, 2020

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์˜ค๋Š˜์˜ ๋‚ด์šฉ์€ ์ €๋ฒˆ ํฌ์ŠคํŒ…์˜ ๋‚ด์šฉ๊ณผ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์ด ๊ฝค ์žˆ์–ด์š”! ๋งŒ์•ฝ [Combine] Publisher ํŽธ์„ ์ฝ์ง€ ์•Š์œผ์…จ๋‹ค๋ฉด ์ฝ๊ณ  ์˜ค์‹œ๋Š”๊ฑธ ๊ถŒํ•ด๋“œ๋ ค์š”!๐Ÿค“

Subscriber

์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Publisher๋ฅผ ์•Œ์•„๋ดค์œผ๋‹ˆ ์ด์ œ Subscriber์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์ฐจ๋ก€์ž…๋‹ˆ๋‹น. ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณผ๊นŒ์š”?

Publisher์—์„œ ๋‚˜์˜ค๋Š” ์š”์†Œ์˜ ํ๋ฆ„์„ ๋ฐ›๋Š”๋‹ค.

์ €๋ฒˆ ํฌ์ŠคํŒ…์˜ ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ€์ ธ์™€ ๋ด…์‹œ๋‹ค๐ŸšŒ ์„ค๋ช…๋Œ€๋กœ Publisher์—์„œ ๋‚˜์˜ค๋Š” ๊ฐ’๋“ค์„ Subscriber๊ฐ€ ๋ฐ›๊ณ  ์žˆ๋„ค์šฉ. ํ•˜๋‚˜์˜ Publisher์—์„œ ๋ฐฉ์ถœํ•˜๋Š” ๊ฐ’์„ ์—ฌ๋Ÿฌ๊ฐœ์˜ Subscriber๊ฐ€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

ํ•œ๊ฐœ์˜ Subscriber
๋‹ค์ˆ˜์˜ 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์—์„œ ๋‚˜์˜จ ๊ฐ’์„ ๋ฐ›๋Š”์ง€์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํ•œ ์„ค๋ช…๊ณผ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค. ๊ทธ๋Ÿผ ๋‹ค์Œ ์‹œ๊ฐ„์— ๋งŒ๋‚˜์š”!

์ด์ „ ํฌ์ŠคํŒ… ๐Ÿ‘ˆ๐Ÿป

๋‹ค์Œ ํฌ์ŠคํŒ… ๐Ÿ‘‰๐Ÿป

์ฐธ๊ณ 

--

--