just, of, from

โšก๏ธ just, of, from โ€” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œํ€€์Šค ํŒฉํ† ๋ฆฌ 3์ด์‚ฌ

โ€œHello, World!โ€๋„ 1์ค„์ด๋ฉด ์ŠคํŠธ๋ฆผ์ด๋‹ค.โ€

์ด ๋ฌธ์„œ์—์„œ๋Š” RxSwift์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ์“ฐ์ด๋Š” ์„ธ ๊ฐ€์ง€ ๋™๊ธฐ(Synchronous) ์‹œํ€€์Šค ์ƒ์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


1๏ธโƒฃ Observable.just(_:) โ€” ๋‹จ์ผ ์š”์†Œ

Observable.just("๐ŸŽ")
    .subscribe(onNext: { print($0) },
               onCompleted: { print("done") })

ํŠน์ง•

  • ํ•˜๋‚˜์˜ ๊ฐ’ onNext โ†’ ์ฆ‰์‹œ onCompleted โ†’ Dispose

  • Cold: ๋งค ๊ตฌ๋…๋งˆ๋‹ค ๊ฐ™์€ ๊ฐ’ ์žฌ์ƒ์‚ฐ

  • ๋ฉ”๋ชจ๋ฆฌยท์Šค์ผ€์ค„๋Ÿฌ ๋ถ€๋‹ด ๊ฑฐ์˜ 0

์œ ๋‹› ํ…Œ์ŠคํŠธ, ์ƒ์ˆ˜ ๋ชจ๋ธ, ๋””ํดํŠธ ์‘๋‹ต Mock ๋“ฑ์— ์œ ์šฉ


2๏ธโƒฃ Observable.of(_:) โ€” ๊ฐ€๋ณ€ ์ธ์ž ๋ฆฌ์ŠคํŠธ

Observable.of(1, 2, 3)
    .toArray()
    .subscribe(onSuccess: { print($0) }) // [1,2,3]

ํŠน์ง•

  • ์ „๋‹ฌ๋ฐ›์€ ์ธ์ž ์ˆœ์„œ๋Œ€๋กœ onNext

  • ์š”์†Œ๊ฐ€ N๊ฐœ์ธ just ํ™•์žฅํŒ

  • ๋ฐฐ์—ด ์ „๋‹ฌ ์‹œ ์˜ค๋ฒ„๋กœ๋“œ ๋ฐฉ์ง€: Observable.of([1,2,3]) โ†’ ์š”์†Œ 1๊ฐœ(๋ฐฐ์—ด) ๋ฐฉ์ถœ

just([1,2,3]) vs of(1,2,3) ํ˜ผ๋™ ์ฃผ์˜


3๏ธโƒฃ Observable.from(_:) โ€” Sequence โ†’ Observable

let names = ["A", "B", "C"]
Observable.from(names)
    .subscribe(onNext: { print($0) })

ํŠน์ง•

  • Sequence ํ”„๋กœํ† ์ฝœ ์ฑ„ํƒ ํƒ€์ž…(Array, Set, Dictionary.keys...) ์ „ํ™˜

  • for-in ๋ฐ˜๋ณต๊ณผ ๊ฐ™์€ ๋™๊ธฐ ํ๋ฆ„ โ†’ ๊น”๋”ํ•œ Operator ์ฒด์ธ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅ

URL(string: "...")
    .map(fetchHTML) // RxSwiftExt optional๋กœ ๋ณ€ํ™˜

4๏ธโƒฃ ์„ฑ๋Šฅ & ์Šค์ผ€์ค„๋Ÿฌ

  • ๋ชจ๋‘ **ํ˜„์žฌ ์Šค๋ ˆ๋“œ(CurrentThreadScheduler)**์—์„œ ์ฆ‰์‹œ ์‹คํ–‰.

  • ๊ฐ’ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„๋„ stack-safe (๋‚ด๋ถ€ generate ์‚ฌ์šฉ).

  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ .observe(on: Main) ๋“ฑ์œผ๋กœ ์Šค๋ ˆ๋“œ ์ „ํ™˜.


5๏ธโƒฃ ์‹ค์ „ ํ™œ์šฉ ์Šค๋‹ˆํŽซ

A. ๋””ํดํŠธ Section ๋ชจ๋ธ ๋ฐœํ–‰

let emptySections = Observable.just([SectionModel(model: "", items: [])])

B. Enum Case ์ŠคํŠธ๋ฆผ

enum Page { case home, settings, about }
Observable.of(Page.home, .settings, .about)

C. JSON ํŒŒ์ผ โ†’ ๋ฐฐ์—ด โ†’ Observable

let items: [Todo] = load("todo.json")
Observable.from(items)
    .bind(to: tableView.rx.items(...))

6๏ธโƒฃ Mini Quiz

  1. Observable.just([1,2,3]).subscribe(...)๋Š” ๋ช‡ ๋ฒˆ onNext๋ฅผ ํ˜ธ์ถœํ• ๊นŒ?

  2. from(Set(["A","B"]))๋ฅผ ๊ตฌ๋…ํ•˜๋ฉด ์š”์†Œ ์ˆœ์„œ๋Š” ๋ณด์žฅ๋ ๊นŒ?

  3. of()๊ณผ from([]) ๋‘˜ ๋‹ค ๋นˆ Observable์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ?

Answers
  1. 1๋ฒˆ โ€” ๋ฐฐ์—ด ์ „์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ์š”์†Œ๋กœ ์ „๋‹ฌ.

  2. ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. Set์€ ์ˆœ์„œ๊ฐ€ ์—†๋Š” Sequence; ์ˆœ์„œ๊ฐ€ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ์˜์กด.

  3. ๊ฐ€๋Šฅํ•˜๋‹ค. Observable.of()๋Š” ์ธ์ž๊ฐ€ ์—†์œผ๋ฉด ์ฆ‰์‹œ .completed๋ฅผ ๋ฐฉ์ถœ, Observable.from([]) ์—ญ์‹œ ์š”์†Œ ์—†์ด .completed.


๋‹ค์Œ โ–ถ๏ธ deferred, timer, interval ๋กœ ๋„˜์–ด๊ฐ€ ์ง€์—ฐยท์ฃผ๊ธฐ ์‹œํ€€์Šค๋ฅผ ๋ฐฐ์›Œ๋ด…์‹œ๋‹ค. ๐Ÿš€

Last updated