[Combine] Publisher

๋ฐœํ–‰๐Ÿญ

naljin
7 min readFeb 23, 2020

Publisher

์ด์ „ ๊ธ€์—์„œ publisher๋Š” ๊ฐ’์„ ๋ฐฉ์ถœํ•˜๋Š” ๊ฒƒ! ์ •๋„๋กœ๋งŒ ์•Œ์•„๋‘์ž ๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ์š”! ํ .. ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ด…์‹œ๋‹ค.

Publisher๋Š” ์–ด๋– ํ•œ ์š”์†Œ(element)๋ฅผ ์‹œ๊ฐ„ ํ๋ฆ„์— ๋”ฐ๋ผ ๋ฐฉ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ฒ˜์Œ์— โ€˜์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผโ€™ ๋ผ๋Š” ๋ฌธ์žฅ์ด ์ง๊ด€์ ์œผ๋กœ ๋‹ค๊ฐ€์˜ค์ง€ ์•Š์•˜์–ด์š”. ํ•˜์ง€๋งŒ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ๋ฐ”๋กœ ์ดํ•ด๊ฐ€ ๋ ๊ฒ๋‹ˆ๋‹ค!

1์ดˆ์— 4 ๋ผ๋Š” ๊ฐ’์„ ๋ฐฉ์ถœํ•˜๊ณ , 5์ดˆ์— 8์ด๋ผ๋Š” ๊ฐ’์„, 8์ดˆ ์ฏค์—๋Š” 15๋ผ๋Š” ๊ฐ’์„ ๋ฐฉ์ถœํ•˜๊ณ  ์žˆ๋‹ค๋Š”๊ฒŒ ๋ณด์ด๋‚˜์š”? โ€˜์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผโ€™ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐฉ์ถœ๋˜๊ณ  ์žˆ์ฃต?

์ด๋ ‡๊ฒŒ ๋ฐฉ์ถœ๋œ ๊ฐ’์€ ํ•˜๋‚˜ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ Subscriber ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค!

ํ•œ๊ฐœ์˜ Subscriber
๋‹ค์ˆ˜์˜ Subscriber

์ด๋ ‡๊ฒŒ ๋ง์ด์ฃ !

์ด๋•Œ Publisher<Int, Never>์— ์ฃผ๋ชฉํ•ด๋ณผ๊นŒ์š”? ๋ฐ”๋กœ Publisher์˜ Output ๊ณผ Failure ํƒ€์ž…์ž…๋‹ˆ๋‹ค! ์ง์ž‘ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด Output์€ publisher๊ฐ€ ๋ฐฉ์ถœํ•˜๋Š” ๊ฐ’์˜ ์ข…๋ฅ˜์ด๊ณ  Failure์€ publisher๊ฐ€ ๋ฐฉ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์—๋Ÿฌ์˜ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” Output์€ Intํ˜•, Failure์€ Never(Error๊ฐ€ ๋ฐœ์ƒํ•  ์ผ์ด ์—†๋‹ค)๊ฐ€ ๋˜๊ฒ ๋„ค์š”.

๋‹น์—ฐํ•˜๊ฒŒ๋„ Subscriber ์˜ Input &Failure ์˜ associated type์€ publisher์˜ Output &Failure ํƒ€์ž…๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Type์ด ์ผ์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹น

Protocol

๊ทธ๋Ÿผ publisher์™€ subscriber์„ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? publisher๋Š” subscriber๋ฅผ ๋ฐ›์•„๋“ค์ด๊ธฐ(accept) ์œ„ํ•ด receive(subscriber:) ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋Š” Publisher protocol์— ์ •์˜๋˜์–ด ์žˆ์–ด์š”~ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ subscriber ๋Š” ํ•ด๋‹น Publisher์—์„œ ๋ฐฉ์ถœํ•˜๋Š” ๊ฐ’๋“ค์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

์ดํ›„์— publisher๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ subscriber์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด์š”! ์ดํ›„ ํฌ์ŠคํŒ…์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์ง€๋งŒ ๊ฐ€๋ณ๊ฒŒ ์ฝ๊ณ  ๋„˜์–ด๊ฐ€๋ณผ๊นŒ์š”?

  • receive(subscription:): subscriber์—๊ฒŒ Subscription ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค! ์ด๊ฒƒ์„ ์ด์šฉํ•ด์„œ subscriber์€ publisher์˜ elements๋ฅผ ์š”๊ตฌํ•˜๊ฑฐ๋‚˜, ๋” ์ด์ƒ ๊ฐ’์„ ๋ฐ›์ง€ ์•Š๊ฒ ๋‹ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”~ Subscription์€ subscriber์™€publisher์˜ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋‚ด๋Š”๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?
  • receive(_:): publisher์—์„œ ์ƒ์„ฑ๋œ element๋ฅผ subscriber๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ์ž…๋‹ˆ๋‹ค.
  • receive(completion:): subscriber ์—๊ฒŒ ์ด๋ฒคํŠธ ๋ฐฉ์ถœ(publishing)์ด ์ •์ƒ์ ์œผ๋กœ ๋˜๋Š” ์—๋Ÿฌ๋กœ ์ธํ•ด ๋๋‚ฌ์Œ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ Publisher์˜ Extensions์€ ๋งŽ์€ ์—ฐ์‚ฐ์ž(operator)๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ์ด๊ฒƒ๋“ค์˜ ์กฐํ•ฉ์„ ํ†ตํ•ด์„œ ์„ธ๋ จ๋œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ์ฒด์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ operator์€ Publisher ํ”„๋กœํ† ์ฝœ์„ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ฒด์ธ์ด ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ์ด๋Ÿฌํ•œ ํƒ€์ž…์˜ ๋Œ€๋ถ€๋ถ„์€ Publishers enumeration์˜ extensions์— ์กด์žฌํ•˜๋Š”๋ฐ์š”..! ์˜ˆ๋ฅผ ๋“ค์–ด map(_:) ์—ฐ์‚ฐ์ž๋Š” Publishers.Map ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋œ๋‹ค๋ฉด ์ดํ›„ ์—ฐ์‚ฐ์ž ๋ถ€๋ถ„์—์„œ ๋‹ค์‹œ ๋ณด๋ฉด ๋˜๋‹ˆ๊นŒ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ‘์‹œ๋‹ค๐Ÿ‘‰

Publisher์˜ ์ข…๋ฅ˜

Convenience Publisher

  • Future: ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋ฐฉ์ถœํ•œ ํ›„ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • Just: ๊ฐ๊ฐ์˜ subscriber์—๊ฒŒ ๋”ฑ ํ•œ ๋ฒˆ ๊ฐ’์„ ๋ฐฉ์ถœํ•˜๊ณ  ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

Future๊ณผ Just์˜ ์ฐจ์ด์ ์„ ๋ณด๊ณ  ์‹ถ์œผ๋ฉด ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”

  • Empty: ์–ด๋–ค ๊ฐ’๋„ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰์‹œ ์ข…๋ฃŒ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Fail: ํŠน์ •ํ•œ error์™€ ํ•จ๊ป˜ ์ฆ‰์‹œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์ด ์™ธ์—๋„ Deferred, Record ๋“ฑ์ด ์žˆ์ง€๋งŒ ์จ๋ณด์ง€ ์•Š์•„์„œ ํ•ด์„ํ•˜๊ธฐ ๊ท€์ฐฎ..์–ด๋ ตโ€ฆ.ใ…Žใ…Ž ํ•„์š”ํ• ๋•Œ ์จ๋ณด๋ฉด์„œ ์•Œ์•„๊ฐ€๊ธฐ๋กœ ํ•˜์ฃ ~~ ํ•˜์ง€๋งŒ ์˜์–ด ์ž˜ํ•˜๋Š” ์กด์ž˜๋‹˜๋“ค์„ ์œ„ํ•ด ์ผ๋‹จ ๋‚จ๊ธฐ๊ณ  ๊ฐ‘๋‹ˆ๋‹ค..ํ•ด์„ํ•ด์ฃผ์„ธ์—ฌ๐Ÿค—

  • Deferred: A publisher that awaits subscription before running the supplied closure to create a publisher for the new subscriber.
  • Record : A publisher that allows for recording a series of inputs and a completion, for later playback to each subscriber.

์ž์‹ ๋งŒ์˜ Publisher ๋งŒ๋“ค๊ธฐ

Combine ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํƒ€์ž…๋“ค์„ ์ด์šฉํ•ด์„œ ์ž์‹ ๋งŒ์˜ publisher๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•๋“ค์€ ๋‚˜์ค‘์— ๋‹ค์‹œ ์„ค๋ช…ํ• ํ…Œ๋‹ˆ ์ผ๋‹จ Publisher๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜๊ตฌ๋‚˜.. ์ •๋„๋งŒ ์•Œ๊ณ  ๊ฐ€์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹น๐Ÿ˜Ž

  • PassthroughSubject์™€ ๊ฐ™์€Subject์˜ subclass๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. send(_:) ์˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ•„์š”์— ๋”ฐ๋ผ ๊ฐ’์„ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๊ธฐ ์œ„ํ•ด CurrentValueSubject ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ž์‹ ์˜ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์˜ ํ”„๋กœํผํ‹ฐ์— @Published annotation ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” publisher๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

์ง€๊ธˆ๊นŒ์ง€ Publisher์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค!๐Ÿ‘๐Ÿป ๋ฐœํ–‰ํ•˜๋Š” ์• ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ตฌ๋…ํ•˜๋Š” ์• ๋„ ์žˆ์–ด์•ผ๊ฒ ์ฃ ? ์ง๊ฟ Subscriber์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋Ÿฌ ๊ฐ€๋ด…์‹œ๋‹ค! ๊ณ ๊ณ ๋ง~~~

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

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

์ฐธ๊ณ 

--

--

Responses (1)