Jiseob Kim

iOS Developer

(RxSwift) Single ์•Œ์•„๋ณด๊ธฐ(1)

04 Feb 2022 » RxSwift


RxSwift์˜ ํฌ์ŠคํŒ…์€ ์ด๊ฒŒ ์ฒ˜์Œ์ธ๋“ฏํ•˜๋‹ค.

์‚ฌ์šฉ์€ ๋งŽ์ด ํ–ˆ์ง€๋งŒ ์‹ฌ๋„์žˆ๊ฒŒ ์•Œ๊ณ  ์‹ถ์œผ๋‹ˆ๊น ์ด์ œ ๊ธ€๋กœ๋„ ์จ๋ณด๊ธฐ!


์ฃผ์ œ๋Š” Single! ์ˆœ์„œ๊ฐ€ ์ด์ƒํ•˜๊ธด ํ•œ๋ฐ,,,

์•„๋ฌดํŠผ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ RxSwift๋Š” ๋‹จ์ˆœํ•˜๋‹ค.

๋ฐฉ์ถœํ•˜๊ณ  ๊ตฌ๋…ํ•œ๋‹ค


๊ฐœ์ธ์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” Rx์˜ ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ฐฉ์ถœํ•˜๋Š” ์ž…์žฅ์—์„  ๋ˆ„๊ฐ€ ๊ตฌ๋…์„ ํ•˜๋˜ ๋ฐฉ์ถœ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. (์˜์กด์„ฑ ๋‚ฎ์ถ”๊ธฐ)
  • ๊ตฌ๋…ํ•˜๋Š” ์ž…์žฅ์—์„  ๋ฐฉ์ถœ๋œ ๊ฐ’์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•œ ๋ฐฉ์ถœ์ž์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ตฌ๋…์ž๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.


ํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์š•์‹ฌ์ด ์ƒ๊ธฐ๊ธฐ ๋งˆ๋ จ์ธ๋“ฏ ์‹ถ๋‹ค.

OOP๋‚˜ ๋””์ž์ธ ํŒจํ„ด์ด๋ผ๋˜๊ฐ€ ์•„ํ‚คํ…์ณ๋ผ๋˜๊ฐ€

์–ด๋– ํ•œ ๋ชฉ์ ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ํŽธํ•˜๊ณ ,

์ข‹๊ฒŒ ๋ฐœ์ „์‹œํ‚ค๊ณ ์ž ํ•˜๋Š” ์š•์‹ฌ๋“ค์€ ์žˆ๋Š” ๋“ฏ ํ•˜๋‹ค.


Rx ๋˜ํ•œ ๋น„์Šทํ•˜๋‹ค ์ƒ๊ฐํ•œ๋‹ค. ๋ฐฉ์ถœ์„ ํ•˜๊ณ  ๊ตฌ๋…ํ•˜๋ฉด ๋์ด์ง€๋งŒ

์–ด๋–ป๊ฒŒ ์กฐ๊ธˆ ๋” ๋ฐฉ์ถœ์„ ์‰ฝ๊ณ  ํŽธํ•˜๊ฒŒ ํ• ๊นŒ?

์–ด๋–ป๊ฒŒ ์กฐ๊ธˆ ๋” ๊ตฌ๋…์„ ์‰ฝ๊ณ  ํŽธํ•˜๊ฒŒ ํ• ๊นŒ?

๋ผ๋Š” ์ƒ๊ฐ์—์„œ Rx์—์„œ Operator๋“ค๊ณผ Single๋“ฑ๋“ฑ ๋งŽ์€ ๊ฒƒ์ด ์ƒ๊ฒจ๋‚œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค.

์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ๊ฒฌํ•ด์ž…๋‹ˆ๋‹ค.


์ด๋Ÿฌํ•œ ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Rx์— ๋Œ€ํ•ด ๊ธ€์„ ์“ด๋‹ค๋ฉด

โ€œ์™œ ์ด Operator๊ฐ€ ๋‚˜์™”์„๊นŒ?, Single์€ ์™œ ๋‚˜์™”์„๊นŒ?โ€

๋ผ๋Š” ์‹์˜ ์ ‘๊ทผ์„ ํ•  ์˜ˆ์ •์ด๋‹ค.



๊ธฐ์กด Observable์˜ ๋ถˆํŽธํ•œ ์ .

๊ฐœ์ธ์ ์œผ๋กœ Swift 5๋ถ€ํ„ฐ ์ง€์›๋˜๋Š” ๋ฌธ๋ฒ•์ธ Result๋ฅผ ์ •๋ง ์ข‹์•„ํ•œ๋‹ค.

์ด๋ฆ„๋„ ๊ฒฐ๊ณผ ๋ผ๋Š” ์ง์„ค์ ์ธ ์ด๋ฆ„์ด๊ณ , Result๋Š” ์—ด๊ฑฐํ˜•์ด๋‹ค

ํ•ด๋‹น๋˜๋Š” case๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • success
  • failure


์ด์ฒ˜๋Ÿผ, ๋‹จ์ˆœํ™” ์‹œํ‚ค๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹๊ฒ ์ง€๋งŒ

Observable์ด ๋ฐฉ์ถœํ•˜๋Š” ์ด๋ฒคํŠธ์˜ ์ข…๋ฅ˜๋Š” ์กฐ๊ธˆ ๋‹ค์–‘ํ•˜๋‹ค

  1. onNext
  2. onError
  3. onCompleted
  4. onDisposed


๊ทธ๋Ÿฐ๋ฐ, ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋ณดํ†ต ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๋ชฉ์ ์„ ์œ„ํ•ด์„œ ์จ์„œ ๊ทธ๋Ÿฐ๊ฑธ๊นŒ?

onNext๋งŒ ์—„์ฒญ๋‚˜๊ฒŒ ์‚ฌ์šฉ ๋น„์ค‘์ด ๋†’์•˜๋‹ค.

๋‚˜๋งŒ ๊ทธ๋Ÿฐ๊ฐ€..


์•„๋ฌดํŠผ ๋‚˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์„ ๋งŽ์ด ์‚ฌ์šฉ ์•ˆํ•˜๊ธฐ ๋•Œ๋ฌธ์—

๋‹จ์ˆœํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฐฉ์ถœ์— ๋Œ€ํ•ด์„œ ์„ฑ๊ณต๊ณผ ์‹คํŒจ ๋‘๊ฐ€์ง€๋งŒ ๋ฐ›๊ณ  ์‹ถ์—ˆ๊ณ ,

๋‚˜๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์•˜๋Š”์ง€?

์ด๋ฅผ ํ•ด์†Œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—ญ์‹œ๋‚˜ ์กด์žฌ ํ•˜์˜€๊ณ ,


๊ทธ๊ฒŒ Single์ด์—ˆ๋‹ค.



Single

์ด๋ฒˆ ๊ธ€์˜ ๋ชฉ์ ์€ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ท„๊ธฐ ๋•Œ๋ฌธ์—

๋‹จ์ˆœํ•˜๊ฒŒ ์•Œ์•„๋ณด๊ณ  ๋‹ค์ŒํŽธ์—์„œ ์กฐ๊ธˆ๋” ์‹ฌ๋„์žˆ๊ฒŒ ๊ธ€์„ ์“ฐ๋ คํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Single์˜ ์ค‘์š”ํ•œ ์ ์€ ์„ฑ๊ณต, ์‹คํŒจ์— ๋Œ€ํ•ด์„œ

๋ฐฉ์ถœํ•œ๋‹ค๋Š” ์ ์ด ํฌ์ธํŠธ๋‹ค.


์„ฑ๊ณต ๋ฐฉ์ถœ

let singleString = Single<String>.just("hi")
let singleArray = Single<[Int]>.just([1,2,3])
let singleInt = Single<Int>.just(5)

just๋ฅผ ์ด์šฉํ•ด ๋‹จ์ˆœํžˆ ๋ฐฉ์ถœ ํ• ์ˆ˜ ์žˆ์Œ์„ ๋ณด์•˜๊ณ ,

์ด๋Š” ํƒ€์ž… ์ถ”๋ก ์„ ํ†ตํ•ด ์กฐ๊ธˆ๋” ์ถ•์•ฝ์„ ํ•˜์ž๋ฉด ์ด๋ ‡๊ฒŒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

let singleString = Single.just("hi")
let singleArray = Single.just([1,2,3])
let singleInt = Single.just(5)


์‹คํŒจ ๋ฐฉ์ถœ

let error = NSError(domain: "test", code: 0, userInfo: nil)
let singleError = Single<String>.error(error)

error๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.


๊ตฌ๋…

// 1. Single & DisposeBag ์ƒ์„ฑ
let singleString = Single.just("hi")
let bag = DisposeBag()

// 2. Single ๊ตฌ๋…
singleString
    .subscribe { event in
    
        // 3. event switch ์ฒ˜๋ฆฌ 
        switch event {
        case .success(let text):
            // 4. ์„ฑ๊ณต์‹œ text ์ถœ๋ ฅ
            print(text)

        case .failure(let error):
            // 5. ์‹คํŒจ์‹œ ์—๋Ÿฌ ์ถœ๋ ฅ
            print(error.localizedDescription)
        }
    }.disposed(by: bag)
    
--- Console Result ---
"hi"

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ Single์„ ๊ตฌ๋… ํ•  ๋•Œ,

event๋ฅผ ๋ฐ›๊ณ  ์ด๊ฒƒ์˜ ํƒ€์ž…์€ Result<String, Error> ์ด๋‹ค.


Result!! ์œ„์— ๋‚˜์™”๋˜ ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๊ทธ๊ฒƒ.

์ด๋ฅผ ํ†ตํ•ด ๊ตฌ๋…์‹œ ์„ฑ๊ณต, ์‹คํŒจ๋งŒ์œผ๋กœ ๊ตฌ๋ฌธ๋˜๊ธฐ ๋•Œ๋ฌธ์—

Observable ๋ณด๋‹จ ๋‹จ์ˆœํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ๋งˆ์Œ์— ๋“ ๋‹ค.


์‚ฌ์‹ค ์ด๋ ‡๊ฒŒ๋งŒ ์“ธ ์ผ์€ ๊ฑฐ์˜ ์—†์„ ๋“ฏํ•˜์ง€๋งŒ,

์ด๊ฒƒ์„ ์•Œ์•„๋‘๋ฉด create๋ฅผ ์‚ฌ์šฉํ• ๋•Œ, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜์ง€?๋Š” ํŒจ์Šค ํ•ด๋„ ๋˜๋ฏ€๋กœ,

์ด๋Ÿฐ๊ฒŒ ์žˆ๋‹ค ์ •๋„ ์•Œ์•„๋‘์ž.


๊ทธ๋ฆฌ๊ณ  ํฅ๋ฏธ๋กœ์šด๊ฑด create์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋‹ค

์‹œ๊ทธ๋‹ˆ์ฒ˜: ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•ด์„œ (๋ฉ”์†Œ๋“œ ์ด๋ฆ„, ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„&์ž๋ฃŒํ˜•, ๋ฆฌํ„ด ๊ฐ’์˜ ์ž๋ฃŒํ˜•)์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ

closer์™€ escaping์ด ๋งŽ์ด ๋‚˜์™€์„œ ์ดํ•ดํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ ธ์ง€๋งŒ,

์ดํ•ดํ•˜๊ณ  ๋‚˜๋‹ˆ ์žฌ๋ฐŒ๋Š” ์ ์ด ๋งŽ์•˜๋‹ค.


์ด๊ฑฐ์Šจ 2ํŽธ์— ๊ณ„์†.


๋!