๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐ŸŽ iOS & Swift

Reactive Programming์ด๋ž€?

๊น€์„ฑ์ผ๋‹˜์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€? ๊ธ€์„ ๋ฉ”์ธ์œผ๋กœ ์ฐธ๊ณ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

-

์ด ๊ธ€์€ ๊ฐœ์ธ์ ์ธ ํ•™์Šต๊ณผ ๊ณต์œ ๋ฅผ ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค.
์ฐธ๊ณ ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋Š” ๊ธ€์˜ ํ•˜๋‹จ์— ๊ธฐ์žฌํ•ด๋†“์•˜์œผ๋ฉฐ ์›๋ฌธ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ด ๋‚ด์šฉ๋„ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 

๋“ค์–ด๊ฐ€๊ธฐ์ „์—

RxSwift๋ฅผ ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ํ•˜์‹œ๋‚˜์š”? ๊ทธ๋Ÿผ ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ๋ฌด์—‡์ธ์ง€, Rx๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ณ  ์‹œ์ž‘ํ•˜๋„๋ก ํ•˜์ฃ .
๊ธ€์„ ์ฝ๊ณ ๋‚˜๋ฉด ์™œ RxSwift๊ฐ€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ API์ธ์ง€ ์ดํ•ด๊ฐ€ ์กฐ๊ธˆ์€ ๊ฐ€์‹ค๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Rx, Reactive Programming ๋‹ค์Œ ํ‚ค์›Œ๋“œ์˜ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋งŒ ์•Œ๊ฒŒ ๋œ๋‹ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๊ฐ€๋ณด๋„๋ก ํ•˜์ฃ .

 

 


 

Reactive Programming(๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์œผ๋กœ์˜ ์—ฌํ–‰

Reactive programming != Rx

Rx

๐Ÿ’ฌ - Rx๋Š” Reactive programming์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” API์ž…๋‹ˆ๋‹ค.

๐Ÿ’ฌ - ๊ทธ๋ ‡๋‹ค๋ฉด RxSwift๋Š” Swift์—์„œ Reactive programming์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” API, Extension์ž…๋‹ˆ๋‹ค.

 

Reactive programming

๊ฐ„๋‹จํ•˜๊ฒŒ ์š”์•ฝํ•˜๋ฉด ํŒจ๋Ÿฌ๋‹ค์ž„(Paradigm) ์ž…๋‹ˆ๋‹ค.

๋” ์ž์„ธํ•˜๊ฒŒ ์œ„ํ‚คํ”ผ๋””์•„์— ์„ค๋ช…์ด ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„(data flows)๊ณผ ๋ณ€ํ™” ์ „ํŒŒ์— ์ค‘์ ์„ ๋‘” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„(programming paradigm)์ด๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ •์  ๋˜๋Š” ๋™์ ์ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํ†ตํ•ด ํ•˜๋ถ€ ์‹คํ–‰ ๋ชจ๋ธ์ด ์ž๋™์œผ๋กœ ๋ณ€ํ™”๋ฅผ ์ „ํŒŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๐Ÿ—ฃ ๋œป์ด ๊ต‰์žฅํžˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์ฃ ..? ๋จธ๋ฆฌ๊ฐ€ ๋น ์งˆ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ƒฅ ์ด๋Ÿฐ๊ฒŒ ์žˆ๊ตฌ๋‚˜ ํ•˜๊ณ  ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ‘์‹œ๋‹ค.
๐Ÿ™‹๐Ÿป‍โ™‚๏ธ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋ญ์ฃ ??
๐Ÿง‘๐Ÿป‍๐Ÿ’ป '์–ด๋–ค(~~~์ด๋Ÿฐ) ๋ฐฉ์‹·๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜์ž' ์ด๋Ÿฐ ์˜๋ฏธ๋ž˜์š”!

 


 

Functional programming

Reactive programming(๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์ด Functional programming(ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

I want to know Rx, more easily

โžก๏ธ ์‚ฌ์‹ค ์•„์ง๊นŒ์ง€๋„ ์ž˜ ์™€๋‹ฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
โžก๏ธ ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ Reactive Programming์ด ์–ด๋–ค ํŒจ๋Ÿฌ๋‹ค์ž„์ธ์ง€๋„ ์•Œ๊ฒ ๊ณ ,   
Rx๋ผ๋Š” ๊ฒƒ์ด Reactive Programming์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” API์ธ ๊ฒƒ๋„ ์•Œ์•˜๋Š”๋ฐ   
ํฌ์ธํŠธ ์ข€ ์•Œ๋ ค์ฃผ์„ธ์š”...๐Ÿ˜ฅ

 

๐Ÿ˜ ์กฐ๊ธˆ ๋” ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค~!

 

 


 

๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์™œ ํ•„์š”ํ• ๊นŒ?

๐Ÿ—ฃ
์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ง์ธ ์ฆ‰์Šจ ๋ฐ˜์‘ํ˜• ์•ฑ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค.
๋ฉ”์ธ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋Š๋ ค์ง€์ง€ ์•Š๋„๋ก ํ•ด์„œ, ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๋ถ€๋“œ๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ์ข‹์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ฉ”์ธ์Šค๋ ˆ๋“œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋ฌด๊ฒ๊ณ  ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํ•ด์•ผ ํ•ด์š”. 
์ด๋Ÿฌํ•œ ์ž‘์—…๋“ค์„ ์„œ๋ฒ„๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š”๋ฐ ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋„คํŠธ์›Œํฌ ์šด์˜์„ ์œ„ํ•œ '๋น„๋™๊ธฐ ์ž‘์—…'์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌํ•ด๋ณด๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ํ•„์š”ํ•œ๋ฐ ์ด ๋•Œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํ•„์š”ํ•œ ๊ฒƒ์ด์ฃ .

๐Ÿง‘๐Ÿป‍๐Ÿ’ป ์ •๋ฆฌ๋ฅผ ์ž ๊น ํ•ด๋ณด๋ฉด, ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ข€ ๋” ์ž˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํ•„์š”ํ•œ ๊ฑฐ๊ตฌ๋‚˜!?

 


 

๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋” ์•Œ์•„๋ณด์ž

์œ„์—์„œ ์‚ดํŽด๋ณด์•˜๋˜ ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ค๋ช…์„ ๊ฐ„๋‹จํ•œ ํ‚ค์›Œ๋“œ๋กœ ๋ฐ”๊พธ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์•ผ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RX = OBSERVABLE + OBSERVERS + SCHEDULERS

Observable

๐Ÿ—ฃ
์šฐ์„ ์ ์œผ๋กœ Observable์€ ๊ณต๊ธ‰์ž๋ผ๊ณ  ์ƒ๊ฐํ•ฉ์‹œ๋‹ค.
๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค๋ฅธ ๊ตฌ์„ฑ์š”์†Œ์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • Observable์€ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์ž…๋‹ˆ๋‹ค.
  • Observable์€ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๊ธฐ์ ์œผ๋กœ ๋˜๋Š” ์„ค์ •์— ๋”ฐ๋ผ ์ƒ์• ์ฃผ๊ธฐ๋™์•ˆ ํ•œ ๋ฒˆ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•ฉ๋‹ˆ๋‹ค.

Observers

๐Ÿ—ฃ
Observable๊ณผ ๋Œ€์‘์‹œ์ผœ์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด Observers๋Š” ์†Œ๋น„์ž(๊ตฌ๋…์ž)๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.
์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Observers๋Š” Observable์— ์˜ํ•ด ๋ฐฉ์ถœ๋œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • Observers๋Š” subscribeOn()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Observable์„ ๊ตฌ๋…ํ•˜๊ณ  Observable์ด ๋ฐฉ์ถœํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Observable์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋“ฑ๋ก๋œ ๋ชจ๋“  Observer๋Š” onNext() ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • onNext()์ฝœ๋ฐฑ์—์„œ JSON ์‘๋‹ต ํŒŒ์‹ฑ์ด๋‚˜ UI ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Observable์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, Observer๋Š” onError()์—์„œ ์—๋Ÿฌ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

Schedulers

Rx๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๊ฒƒ์ด๊ณ , ์šฐ๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—ฃ
Schedulers๋Š” Observable๊ณผ Observers์—๊ฒŒ ๊ทธ๋“ค์ด ์‹คํ–‰๋˜์–ด์•ผ ํ•  ์Šค๋ ˆ๋“œ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” Rx์˜ ๊ตฌ์„ฑ์š”์†Œ์ž…๋‹ˆ๋‹ค.
  • observeOn() ๋ฉ”์„œ๋“œ๋กœ observers์—๊ฒŒ ๊ด€์ฐฐํ•ด์•ผ ํ•  ์Šค๋ ˆ๋“œ๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • scheduleOn() ๋ฉ”์„œ๋“œ๋กœ observable์ด ์‹คํ–‰ํ•ด์•ผ ํ•  ์Šค๋ ˆ๋“œ๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


 

์•ฑ์—์„œ Rx๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ 3๋‹จ๊ณ„

๋ชจ๋“  Rx์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ๊ธฐ์–ตํ•ด์•ผํ•  ๊ฒƒ์€ 3๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. observable observer Thread

์‚ฌ์‹ค ๋’ค์—์„œ ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฒƒ์ด ์žˆ๋‹ค๋ผ๊ณ ๋งŒ ์ƒ๊ฐํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
3๊ฐ€์ง€ ํŠน์ง•๋งŒ ๊ฐ€๋ณ๊ฒŒ ๋ณด๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•ฉ์‹œ๋‹ค.

General Marble Diagram

Step 1 : ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” observable ์ƒ์„ฑ:

  • Observable์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Step 2 : ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•˜๋Š” observer ์ƒ์„ฑ:

  • Observable(์˜ต์ €๋ฒ„๋ธ”)์ด ๋ฐฉ์ถœํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•˜๋Š” Observer๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ์™€ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Step 3 : ๋™์‹œ์„ฑ ๊ด€๋ฆฌ:

  • ๋™์‹œ์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ง€, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

 


 

๋งˆ๋ฌด๋ฆฌ ์‹œ๊ฐ„

์ •๋ฆฌ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๋ณด๋„๋ก ํ•ด์š”. ๋‚ด์šฉ์ด ์กฐ๊ธˆ ๊ธธ์—ˆ์ง€๋งŒ ์•„๋ž˜์˜ ๋‚ด์šฉ์ด ์ „๋ถ€๋ž๋‹ˆ๋‹ค.

  • Reactive Programming์€ ํ•˜๋‚˜์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค.
  • Reactive Programming์€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.
  • Rx๋Š” Reactive Programming์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” API, Extension์ด๋‹ค.
  • Rx๋Š” Observable, Observers, Schedulers 3๊ฐ€์ง€๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Observable์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” ์—ญํ• , Observers๋Š” Observable์„ ๊ตฌ๋…ํ•˜๊ณ  Observable์ด ๋ฐฉ์ถœํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ , ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. Scheduler๋Š” ์ž‘์—…์„ ์–ด๋–ค ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•  ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

ํ•œ ์ค„ ์š”์•ฝ (๋‘ ์ค„..?! ใ…Žใ…Ž)

๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๋ฐฉ์‹์ด๊ตฌ๋‚˜...
Rx๋Š” ๊ทธ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์ด๊ตฌ๋‚˜...

 


 

๋ ˆํผ๋Ÿฐ์Šค

https://medium.com/@kevalpatel2106/what-is-reactive-programming-da37c1611382

https://dev-daddy.tistory.com/25

https://zeddios.tistory.com/303

https://www.raywenderlich.com/books/rxswift-reactive-programming-with-swift/v4.0/chapters/1-hello-rxswift