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

๐ŸŽ iOS/RxSwift

[RxSwift] RxSwift์™€ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 

์•ˆ๋…•ํ•˜์„ธ์š”! ์ œ์ธ์ž…๋‹ˆ๋‹ค :)

์š”์ฆ˜ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์„ ๋Š๋ผ๊ณ , ์•„ํ‚คํ…์ฒ˜ ๊ณต๋ถ€๋„ ์‹œ์ž‘ํ•˜๋‹ค ๋ณด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ RxSwift์— ๊ด€์‹ฌ์ด ์ƒ๊ฒจ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๊ณ  ์žˆ๋Š”๋ฐ์š”! 

RxSwift์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ •๋ฆฌํ•ด๋‚˜๊ฐ€๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

RxSwift๋ž€?

RxSwift๋Š” Reactive eXtension + Swift์˜ ํ•ฉ์„ฑ์–ด๋กœ ์ด๋ฃจ์–ด์ง„ ์šฉ์–ด๋กœ,

Swift์— ReactiveX๋ฅผ ์ ์šฉ์‹œ์ผœ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง๊ด€์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ReactiveX๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?๐Ÿค”

ReactiveX ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ๋”ฐ๋ฅด๋ฉด ReactiveX๋ž€,

An API for asynchronous programming
with observable streams

 

'์˜ต์ €๋ฒ„๋ธ” ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ ์œ„ํ•œ API' ์ฏค์œผ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋˜ ๋“œ๋Š” ์˜๋ฌธ.. ์˜ต์ €๋ฒ„๋ธ”์ด ๋ญ์ง€..? ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ญ์ง€..? 

ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ด…์‹œ๋‹ค!

Observable

observable์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” '๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋Š”' ์ž…๋‹ˆ๋‹ค.

๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ๋Š” observable์„ ์–ด๋–ป๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์„๊นŒ์š”?

ReactiveX์—์„œ ์˜ต์ €๋ฒ„๋Š” Observable์„ ๊ตฌ๋…ํ•œ๋‹ค. Obseravable์ด ๋ฐฐ์ถœํ•˜๋Š” ํ•˜๋‚˜ ๋˜๋Š” ์—ฐ์†๋œ ํ•ญ๋ชฉ์— ์˜ต์ €๋ฒ„๋Š” ๋ฐ˜์‘ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํŒจํ„ด์€ ๋™์‹œ์„ฑ ์—ฐ์‚ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” Observable์ด ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ถœํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š” ์—†์ด ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๋ฐฐ์ถœ๋˜๋ฉด ๊ทธ ์‹œ์ ์„ ๊ฐ์‹œํ•˜๋Š” ๊ด€์ฐฐ์ž๋ฅผ ์˜ต์ €๋ฒ„ ์•ˆ์— ๋‘๊ณ  ๊ทธ ๊ด€์ฐฐ์ž๋ฅผ ํ†ตํ•ด ๋ฐฐ์ถœ ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ReactiveX์—์„œ Observable ๊ฐ์ฒด๋Š” ์‚ฌ์ „์ ์ธ ์˜๋ฏธ๋Œ€๋กœ ์–ด๋–ค '๊ฐ์ฒด'๋ฅผ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋งํ•˜๋ฉฐ, 

Observable ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ Observer๋Š” ๊ด€์ฐฐ์„ ์‹œ์ž‘(๊ตฌ๋…)ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

์ด '๊ฐ์ฒด'์— ๋”ฐ๋ผ ์‹ค์ œ ๊ด€์ฐฐํ•˜๋Š” ๊ฐ’(= ์ŠคํŠธ๋ฆผ์— ํ˜๋ ค๋ณด๋‚ด๋Š” ๊ฐ’) ํ˜น์€ ๊ด€์ฐฐ์˜ ๋Œ€์ƒ์ธ ์‚ฌ๊ฑด(=์ด๋ฒคํŠธ)์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, Observable์€ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ž…๋‹ˆ๋‹ค. Observer๊ฐ€ Observable์„ ๊ตฌ๋…ํ•˜๊ณ , Observable์ด ๋ฐฉ์ถœํ•˜๋Š” ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜์‘ํ˜•(Reactive) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ€์žฅ ํฐ ํ•ต์‹ฌ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

ํ›„์— GCD์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ณ , ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์— ๋Œ€ํ•œ ๊ฐœ๋…๋งŒ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๊ณ  ๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค!

 

๋™๊ธฐ(Synchronous)

๋™๊ธฐ๋Š” '๋™์‹œ์— ๋ฐœ์ƒ[์กด์žฌ]ํ•˜๋Š”' ์ด๋ผ๋Š” ์‚ฌ์ „์  ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋™์‹œ์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „์  ์˜๋ฏธ๋งŒ ๋ณธ๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…์„ ๋™์‹œ์— ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์œผ๋กœ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋™๊ธฐ์˜ ๋œป์€

์š”์ฒญ๊ณผ ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ์‰ฌ์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์š”์ฒญ์„ ํ•˜๋ฉด, ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฌ๋˜์ง€ ์š”์ฒญํ•œ ์ž๋ฆฌ์—์„œ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

๋น„๋™๊ธฐ(Asynchronous)

๋น„๋™๊ธฐ๋Š” ๋™๊ธฐ์˜ ๋ฐ˜๋Œ€๋กœ, ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š์Œ์„ ๋œปํ•˜๋ฉฐ ์ด๋Š” ์ž‘์—…๋“ค์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ํƒ€์ด๋ฐ์ด ๊ฐ™์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋กœ ๋‚˜์˜ค์ง€ ์•Š์•„๋„ ์ด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด, ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋™๊ธฐ ๋ฐฉ์‹์€ ์„ค๊ณ„๊ฐ€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ๊นŒ์ง€ ๋’ค์˜ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๊ณ ,

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

์™œ RxSwift๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

์œ„์™€ ๊ฐ™์ด RxSwift๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ API์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ๊ธฐ์กด Swift์—์„œ๋„ Dispatch Queue๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๊ณ , PromiseKit์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ์ค‘ RxSwift๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

 

๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ๋ฅผ ์ข€ ๋” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด์„œ! ๋ผ๊ณ  ๊ฐ„๋‹จํžˆ ์š”์•ฝํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ์š”,

RxSwift์˜ ์žฅ์ ์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ด…์‹œ๋‹ค!

 

 

1. ๋น„๋™๊ธฐ๋ฅผ ๋™๊ธฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  

์ผ๋ฐ˜์ ์œผ๋กœ ๋น„๋™๊ธฐ๋Š” callback์„ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Swift์—์„œ๋Š” @escaping ๋“ฑ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
๋น„๋™๊ธฐ๊ฐ€ ์ค‘์ฒฉ์ด๋˜๋ฉด ๊ต‰์žฅํžˆ ๋ณต์žกํ•œ ๊ตฌ์กฐ๊ฐ€ ๋˜๋Š”๋ฐ, RxSwift๋ฅผ ์ด์šฉํ•ด ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ƒ๊ธฐ๋Š” ๊ฒฐ๊ณผ ๊ฐ’์˜ ๋ฐ์ดํ„ฐ๋ฅผreturn ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์—ฌ @escaping ์—†์ด ์–ด๋– ํ•œ ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ด ๋ฐ›์•„ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. ์ผ๊ด€์„ฑ์ด ์—†๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ํ•ด๊ฒฐ

๊ธฐ์กด Swift์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ณณ์—์„œ๋Š” DispatchQueue, ์–ด๋–ค ๊ณณ์—์„œ๋Š” OperationQueue ์ด๋ ‡๊ฒŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, RxSwift์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋กœ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๊ฒ ์ฃ ?

 

3. ํ™•์žฅ ๋ถˆ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ํ•ด๊ฒฐ

2๋ฒˆ๊ณผ๋„ ์ด์–ด์ง€๋Š” ๋‚ด์šฉ์ธ๋ฐ์š”, ์ผ๊ด€์„ฑ ์—†๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•œ ๋กœ์ง์€ ์กฐํ•ฉ์ด๋‚˜ ํ™•์žฅ์— ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, RxSwift๋ฅผ ์ด์šฉํ•ด ์ผ๊ด€์„ฑ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์•„ํ‚คํ…์ฒ˜์˜ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

4. Thread ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๋งŒ์•ฝ RxSwift๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด? A๋ผ๋Š” ๊ฐ’์„ ๋ฐ›์•„์™€์•ผ B๋ผ๋Š” ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๊ณ , B๋ผ๋Š” ๊ฐ’์„ ๋ฐ›์•„์™€์•ผ C๋ผ๋Š” ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๊ณ , C๋ผ๋Š” ๊ฐ’์„ ๋ฐ›์•„์™€์•ผ D๋ผ๋Š” ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ๋Š” ํ”ํžˆ ๋งํ•˜๋Š” ์ฝœ๋ฐฑ(CallBack) ์ง€์˜ฅ์ด ์ฝ”๋“œ์— ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ RxSwift๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•œ ๋กœ์ง์„ ์กฐํ•ฉํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ฝœ๋ฐฑ ์ง€์˜ฅ์—์„œ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.  ๋”ฐ๋ผ์„œ UI ์ด๋ฒคํŠธ, ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ–ˆ์„ ๋•Œ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. ๊ทธ๋งŒํผ ์ฝ”๋“œ๋„ ๊น”๋”ํ•ด์ง€๊ฒ ์ฃ ?

 

 

์—ฌ๊ธฐ๊นŒ์ง€ RxSwift์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ์ด์œ ๊นŒ์ง€ ์ •๋ฆฌํ•ด๋ณด์•˜๋Š”๋ฐ์š”!

์•ž์œผ๋กœ RxSwift์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์ •๋ฆฌํ•ด๋‚˜๊ฐ€๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

์ƒˆ๋กญ๊ฒŒ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•˜๋Š” ๋‚ด์šฉ์ด๋‹ˆ ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ˜Š

 


[์ฐธ๊ณ ์ž๋ฃŒ]

 

https://www.youtube.com/watch?v=w5Qmie-GbiA&t=15s 

https://kimsama.gitbooks.io/unirx/content/observable/

https://private.tistory.com/24

https://beenii.tistory.com/178

https://medium.com/@jang.wangsu/ios-swift-rxswift-์™œ-์‚ฌ์šฉํ•˜๋ฉด-์ข‹์„๊นŒ์š”-5c9995f47bab

'๐ŸŽ iOS > RxSwift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[RxSwift] Traits - Driver, Signal, Control Property/ControlEvent  (0) 2023.04.29
[RxSwift] Traits - Single, Completable, Maybe  (0) 2023.04.17
[RxSwift] Relay๋ž€?  (0) 2023.02.17
[RxSwift] Subject๋ž€?  (0) 2023.02.03
[RxSwift] Observable  (0) 2022.05.02