๐ŸŽ iOS/RxSwift

RxSwift #1 ์‹œ์ž‘ํ•˜๊ธฐ

JerryiOS 2023. 4. 25. 13:51

 

RxSwift

์ฝ”๋“œ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์— ๋ฐ˜์‘ํ•˜๋ฉฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‰ฝ๊ฒŒ ํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์œ„์˜ ์ •์˜๋กœ๋งŒ ๋ณด๋ฉด ์–ด๋ ต๋‹ค. ์ƒํ™ฉ์„ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž

 

ํ•œ ํ™”๋ฉด์—์„œ 3๋ฒˆ ๋„คํŠธ์›Œํ‚นํ•˜์—ฌ ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผํ• ๊นŒ?

์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” GCD๋ฅผ ์ด์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ–ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ RxSwift๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋” ์‰ฝ๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

RxSwift๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ดํ•ด๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์„ ์•Œ์•„๋ณด์ž

 

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์šฉ์–ด๋“ค

1. State (Shared mutable state)

iOS ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ ๋น„๋™๊ธฐ์ ์ธ State๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๋‹ค.

ex) ์ข‹์•„์š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ TabBar๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•œ ํ™”๋ฉด์—์„œ ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋“  ํƒญ์—์„œ isLike์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค.

๊ธฐ์กด์—๋Š” Notification Center๋ฅผ ์‚ฌ์šฉํ•ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ RxSwift๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ๋ช…๋ นํ˜•ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Imperative programming)

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)

  setupUI()
  connectUIControls()
  createDataSource()
  listenForChanges()
}
  • ๊ฐ๊ฐ์˜ ๋ฉ”์„œ๋“œ๋“ค์ด ํ•˜๋Š” ์ผ์„ ์•Œ ์ˆ˜ ์—†๋‹ค.
  • ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ๋ฉ”์„œ๋“œ๋“ค์ด ์ž‘๋™ํ• ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

3. Side Effect 

์–ด๋–ค ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์„œ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜๋Š” ํ–‰์œ„
  • connectUIControls()๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ UI ๊ตฌ์„ฑ์š”์†Œ์— ์—ฐ๊ฒฐํ•œ๋‹ค. View์˜ state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด Side Effect๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • Side Effect๊ฐ€ ๋‚˜์œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ปจํŠธ๋กค์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ฐ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ Side Effect๋ฅผ ์ผ์œผํ‚ค๋Š”์ง€, ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ถœ๋ ฅํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

4. ์„ ์–ธ์  ์ฝ”๋“œ (Declarative code)

  • ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์›ํ•˜๋Š” ๋Œ€๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.
  • ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ์—์„œ๋Š” Side Effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค.
  • RxSwift์—์„œ๋Š” ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค.
  • ์„ ์–ธํ˜• ์ฝ”๋“œ(Declarative code)๋กœ ๋™์ž‘์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ , RxSwift๋Š” ๊ด€๋ จ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋™์ž‘์„ ์‹คํ–‰ํ•˜๊ณ  ๋ถˆ๋ณ€์˜ ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹จ์ˆœ for๋ฌธ๊ณผ ๋™์ผํ•œ ๊ฐ€์ •์„ ํ•œ๋‹ค. ๋ถˆ๋ณ€์˜ ๋ฐ์ดํ„ฐ๋กœ ์ž‘์—…ํ•˜๊ณ  ์ˆœ์ฐจ์ ์ด๊ณ  ๊ฒฐ์ •๋ก ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

5. Reactive Systems (๋ฐ˜์‘ํ˜• ์‹œ์Šคํ…œ)

๋ฐ˜์‘ํ˜• ์‹œ์Šคํ…œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์˜ ๋Œ€๋ถ€๋ถ„์„ ๋‚˜ํƒ€๋‚ด๋Š” iOS์•ฑ์„ ํฌํ•จํ•œ๋‹ค.
  • ๋ฐ˜์‘ (Responsive): ํ•ญ์ƒ ๊ฐ€์žฅ ์ตœ์‹ ์˜ State๋ฅผ ํ‘œ์‹œํ•˜๋ฉฐ, UI๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•œ๋‹ค.
  • ๋ณต์›๋ ฅ (Resilient) : ๊ฐ๊ฐ์˜ ํ–‰๋™์€ ๊ณ ์œ ํ•˜๊ฒŒ ์ •์˜๋˜๋ฉฐ ์—๋Ÿฌ ๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด ์œ ์—ฐํ•˜๊ฒŒ ์ œ๊ณตํ•œ๋‹ค.
  • ํƒ„๋ ฅ์„ฑ (Elastic) : ์ฝ”๋“œ๋Š” ๋‹ค์–‘ํ•œ ๋ถ€ํ•˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ข…์ข… lazy pull๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ์ˆ˜์ง‘, Event throtting, ๋ฆฌ์†Œ์Šค ๊ณต์œ ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ (Message driven) : ๊ตฌ์„ฑ์š”์†Œ๋Š” ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์‚ฌ์šฉ ๋ฐ ๊ณ ์œ  ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ณ , ๋ผ์ดํ”„ ์‚ฌ์ดํด๊ณผ ํด๋ž˜์Šค ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•œ๋‹ค.

RxSwift ๊ธฐ์ดˆ

1. Observable

  • ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ
  • RxSwift๋Š” Observable์„ ํ†ตํ•ด ๊ฐ’์„ ๋ฐฐ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ๊ฐ’์„ ๊ด€์ฐฐํ•˜๊ณ  ๋ฐ˜์‘ํ•œ๋‹ค.
  • ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ด€์ฐฐ์ž(Observer)๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์–ด๋–ค ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•˜๊ณ  UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

ObservableType ํ”„๋กœํ† ์ฝœ

Observable์€ ์„ธ๊ฐ€์ง€ ์ด๋ฒคํŠธ๋งŒ ๋ฐฉ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

  • next : ์ตœ์‹ (๋‹ค์Œ)๊ฐ’์„ ์ „์†กํ•˜๋Š” ์ด๋ฒคํŠธ
  • error : Observable์ด ๊ฐ’์„ ๋ฐฐ์ถœํ•˜๋‹ค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด error๋ฅผ ๋ฐœ์ƒํ•˜๊ณ  ์ข…๋ฃŒ์‹œํ‚ค๋Š” ์ด๋ฒคํŠธ
  • complete : ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ์ด๋ฒคํŠธ. Observable์ด ๊ฐ’์„ ๋”์ด์ƒ ๋ฐฐ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

Finite Observable Sequence

1๊ฐœ์˜ ๊ฐ’์„ ๋ฐฉ์ถœํ•˜๊ณ  ์ข…๋ฃŒ๋˜๋Š” ์‹œํ€€์Šค์˜ ์˜ˆ์ œ๋กœ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž

  1. ๋จผ์ € ๋‹ค์šด๋กœ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€์ฐฐํ•œ๋‹ค.
  2. ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ณ  ํŒŒ์ผ๋กœ ์ €์žฅํ•œ๋‹ค.
  3. ๋งŒ์•ฝ ๋„คํŠธ์›Œํ‚น ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๊ฑฐ๋‚˜ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  4. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋ฉด ์„ฑ๊ณต์œผ๋กœ ์™„๋ฃŒ
API.download(file: "http://filePath....")
    .subscribe(onNext: { data in
        // ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅ
    }, onError: { error in
        // ๋‹ค์šด๋กœ๋“œ ์—๋Ÿฌ ๋ฐœ์ƒ
    }, onCompleted: {
        // ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ
    })
  • API.download(file:) : ๋„คํŠธ์›Œํ‚น ๊ฒฐ๊ณผ๋กœ Data๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” Observable<Data>๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
  • onNext ํด๋กœ์ € : next ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
  • onError ํด๋กœ์ € : error ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ ๋กœ๊ทธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.
  • onCompleted ํด๋กœ์ € : completed ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ๋‹ค์šด๋กœ๋“œ ์ดํ›„์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Infinite Observable Sequence

๋‹ค์šด๋กœ๋“œ์ฒ˜๋Ÿผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ข…๋ฃŒ๋˜๋Š” ์‹œํ€€์Šค์™€ ๋‹ฌ๋ฆฌ ๋ฌดํ•œํžˆ ๊ด€์ฐฐ๊ฐ€๋Šฅํ•œ ์‹œํ€€์Šค๋„ ์กด์žฌํ•œ๋‹ค.

๋ณดํ†ต UI Event๋Š” ๋ฌดํ•œํ•˜๊ฒŒ ๊ด€์ฐฐ๊ฐ€๋Šฅํ•œ ์‹œํ€€์Šค๋‹ค. ์•ฑ์˜ ๊ธฐ๊ธฐ ๋ฐฉํ–ฅ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ๋Œ€์‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์˜ˆ์ œ๋กœ ์‚ดํŽด๋ณด์ž.

 

RxSwift๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด NotificationCenter์—์„œ UIDeviceOrientationDidChange์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›์•„ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋‹ค.

NotificationCenter.default.addObserver(self,
                                       selector: #selector(rotated),
                                       name: NSNotification.Name.UIDeviceOrientationDidChange,
                                       object: nil)
func rotated() {
    if UIDeviceOrientationIsLandscape(UIDevice.current.orientation) {
        print("landscape ์ƒํƒœ")
    }

    if UIDeviceOrientationIsPortrait(UIDevice.current.orientation) {
        print("portrait ์ƒํƒœ")
    }

}

 

์ด ๋ถ€๋ถ„์„ RxSwift๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•ด๋ณด์ž.

UIDevice.rx.orientation
  .subscribe(onNext: { current in
    switch current {
      case .landscape:
        print('landscape ์ƒํƒœ')
      case .portrait:
        print('portrait ์ƒํƒœ')
    }
  })
  • UIDevice.rx.orientation : Observable<Orientation>์„ ํ†ตํ•ด ๋งŒ๋“  ๊ฐ€์ƒ์˜ ์ฝ”๋“œ
  • orientation์„ subscribeํ•˜์—ฌ orientation์˜ ๊ฐ’์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ํ˜„์žฌ์˜ orientation์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ๊ทธ ๊ฐ’์„ ์ด์šฉํ•ด UI๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ๊ฒฝ์šฐ, onError, onCompleted๋Š” ์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

2. Operator

  • Observable ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ
  • ObservableType๊ณผ Observable ํด๋ž˜์Šค์—๋Š” ๋ณต์žกํ•œ ๋…ผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋“ค์„ Operator๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • Operator๋Š” ๋น„๋™๊ธฐ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ถœ๋ ฅ๋งŒ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Observable์ด ๋ฐฉ์ถœํ•œ ๊ฐ’์— Rx Operator๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ถ€์ˆ˜์ž‘์šฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์œ„์—์„œ ๋‹ค๋ค˜๋˜ ๋ฐฉํ–ฅ์ „ํ™˜ ์˜ˆ์ œ์— Rx Operator๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž

UIDevice.rx.orientation
  .filter { $0 != .landscape }
  .map { _ in
    return "portrait ์ž…๋‹ˆ๋‹ค."
  }
  .subscribe(onNext: { msg in
    print(msg)
  })

orientation์ด .lanscape, .portrait๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค Rx๋Š” ๋ฐฉ์ถœ๋œ ๋ฐ์ดํ„ฐ์— ๊ฐ๊ฐ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉํ•œ๋‹ค.

  1. .filter : .landscape๊ฐ€ ์•„๋‹Œ ๊ฐ’๋งŒ ํ†ต๊ณผ์‹œํ‚จ๋‹ค.
  2. .map : .portrait ๊ฐ’์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด map์€ "portrait ์ž…๋‹ˆ๋‹ค." ์ถœ๋ ฅ์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  3. .subscribe : next ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  msg๊ฐ’์„ ๋ฐ›์•„ printํ•œ๋‹ค.

3. Schedulers

  • Rx์—์„œ DispatchQueue์™€ ๊ฐ™๋‹ค. ๋‹ค๋งŒ ํ›จ์”ฌ ์‰ฝ๊ณ  ๊ฐ•๋ ฅํ•˜๋‹ค.
  • RxSwift์—๋Š” ์—ฌ๋Ÿฌ Scheduler๊ฐ€ ์ด๋ฏธ ์ •์˜๋˜์–ด ์žˆ์–ด์„œ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋”ฐ๋กœ ์ž์‹ ์˜ ์Šค์ผ€์ฅด๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•  ์ผ์€ ๋“œ๋ฌผ๋‹ค.
  • ๊ธฐ์กด์—๋Š” GCD๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด, Scheduler๋ฅผ ์‚ฌ์šฉํ•œ RxSwift์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.

๋„คํŠธ์›Œํ‚น์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž. ๋„คํŠธ์›Œํ‚น์— ํ•„์š”ํ•œ ์ž‘์—…์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. fetch JSON
  2. process JSON
  3. display UI
  • fetch JSON์€ custom Scheduler์—์„œ ๊ตฌ๋™๋œ๋‹ค.
  • ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ JSON์€ Background Concurrent Scheduler์—์„œ processํ•œ๋‹ค.
  • ์ดํ›„, UI์ž‘์—…์€ Main Thread Serial Scheduler์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.

 

RxCocoa

RxCocoa๋Š” RxSwift์˜ companion ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, UIkit๊ณผ Cocoa ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

RxCocoa๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UIButton์˜ Tap ์ด๋ฒคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

button.rx.tap.subscribe(onNext: { _ in
    print("tap tap")
})

 

์ด์™ธ์—๋„ UIViewController, UITextView, UIWebView ๋“ฑ์— rx๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 


์ถœ์ฒ˜

https://okanghoon.medium.com/rxswift-1-rxswift-%EC%9E%85%EB%AC%B8-67bfdbd91969

๋ฐ˜์‘ํ˜•