sladuf
200
sladuf
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (83)
    • ๐Ÿ“š Programming (32)
      • Swift (13)
      • JAVA (2)
      • Python (6)
      • SQL (6)
      • Web (5)
    • ๐Ÿ“ฑ iOS (25)
      • Base (7)
      • SwiftUI (9)
      • UIKit (7)
      • ์ธ๊ฐ• & ์ฑ… (2)
    • ๐Ÿ”— Algorithm (20)
      • Python (12)
      • Swift (3)
      • Tip (5)
    • ๐Ÿ—‚ ETC (6)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • Swift
  • ์Šค์œ„ํ”„ํŠธ

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

๊ธ€์“ฐ๊ธฐ ์„ค์ •
hELLO ยท Designed By ์ •์ƒ์šฐ.
sladuf

200

[RxSwift] ๊ฐœ๋…์žก๊ธฐ (Subscribe, Observable, Subject)
๐Ÿ“ฑ iOS/Base

[RxSwift] ๊ฐœ๋…์žก๊ธฐ (Subscribe, Observable, Subject)

2023. 2. 4. 01:29

 

 

 

 

์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•ด๋ณด๋Š” RxSwift

 

 

iOS ๊ณต๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ฌด์กฐ๊ฑด ๋“ค์–ด๋ดค์„ RxSwift

RxSwift๋Š” ReactiveX Swift์ธ๋ฐ์š”,

 

reactiveX ?

๋Œ€์ถฉ ํ•ด์„ํ•˜๋ฉด ์˜ต์ €๋ฒ„๋ธ”์„ ์‚ฌ์šฉํ•ด์„œ ๋น„๋™๊ธฐ๋‚˜ event-based๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค

์˜ต์ €๋ฒ„๋ธ”์ด ๋ญ”๋ฐ ?????

 

Observable ?

๋Œ€์ถฉ ํ•ด์„ํ•˜๋ฉด

- ์˜ต์ €๋ฒ„๋Š” ์˜ต์ €๋ฒ„๋ธ”์„ ๊ตฌ๋…ํ•œ๋‹ค
- ์˜ต์ €๋ฒ„๋Š” ์˜ต์ €๋ฒ„๋ธ”์ด ๋ฐฉ์ถœํ•˜๋Š” items์— ๋Œ€ํ•ด ๋ฐ˜์‘ํ•œ๋‹ค
- ์˜ต์ €๋ฒ„๋Š” ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ , ๋ฐ˜์‘ํ•  ์ค€๋น„๋ฅผ ํ•œ ์–ด๋– ํ•œ ํ˜•ํƒœ๋กœ ๊ธฐ๋‹ค๋ฆฐ๋‹ค

 

items์ด ์–ด๋–ค๊ฑด์ง€๋Š” ๋ชฐ๋ผ๋„ ์ผ๋‹จ ์˜ต์ €๋ฒ„๋Š” ์˜ต์ €๋ฒ„๋ธ”์ด ๋ญ”๊ฐ€๋ฅผ ํ•˜๋ฉด ๋ฐ˜์‘ํ•œ๋Œ€!!

์˜ต์ €๋ฒ„๊ฐ€ ๋ฌด์Šจ ํ˜•ํƒœ์ธ์ง€๋Š” ๋ชฐ๋ผ๋„ ์ผ๋‹จ ๋Œ€๊ธฐ ใ„ดใ„ด ์ฆ‰, sync ใ„ดใ„ด

 

๋งŽ์€ ์šฉ์–ด๋“ค์ด ๋‚˜์˜ค๋Š”๋ฐ Observer, Observable, Subscribe

๊ทผ๋ฐ ์ด ์šฉ์–ด๋“ค์ด Rx์˜ ์‹œ์ž‘๊ณผ ๋์ด๋‹ค!

์˜ต์ €๋ฒ„๊ฐ€ ์˜ต์ €๋ฒ„๋ธ”์„ ๊ตฌ๋…!! ํ•˜๋Š”๋ฐ ์šฐ๋ฆฌ๋Š” ์ด ๊ตฌ๋…!! ์ด ๋ญ”์ง€๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ํฌ์ธํŠธ์ž„

 

RxSwift Concept

์šฐ๋ฆฌ youtube์—์„œ ๊ตฌ๋…์ด๋ผ๋Š” ๊ฒƒ์„ ํ•˜์ž–์•„์š”?

๊ตฌ๋…์„ ํ•˜๋ฉด ์ผ์–ด๋‚˜๋Š” ์ผ์„ ๐Ÿฆถ๋กœ ๊ทธ๋ ค๋ณด์•˜์–ด์š”

 

๋‚˜๋Š” ๊ตฌ๋…์ž ์ฆ‰, ์˜ต์ €๋ฒ„์—์š”

์˜ต์ €๋ฒ„๋Š” ์˜ต์ €๋ฒ„๋ธ”์„ ๊ตฌ๋…ํ•œ๋‹ค๊ณ  ํ–ˆ์ฃ ? ๊ทธ๋Ÿผ ์ œ๋‹ˆ๊ฐ€ ์˜ต์ €๋ฒ„๋ธ”์ด ๋˜๊ฒ ๋„ค์š”

๋‹ค์‹œ ๋‚˜ํƒ€๋‚ด๋ฉด,

 

์—ฅ?? ๊ฐ‘์ž๊ธฐ onNext()? ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด์ œ๋ถ€ํ„ฐ ์‚ดํŽด๋ณผ๊ฒŒ์š”..ใ…Žใ…Ž

 

์šฐ๋ฆฌ๊ฐ€ ์œ ํŠœ๋ธŒ์—์„œ ๊ตฌ๋…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ตฌ๋… ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋Š” ๊ฑฐ์ฃ 

RxSwift์—์„œ ์˜ต์ €๋ฒ„๋ธ”์„ ๊ตฌ๋…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€,

Observable.subscribe(event)

์šฐ๋ฆฌ๊ฐ€ ๊ตฌ๋…๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ๋ฐ”๋ผ๋Š”๊ฒƒ์€ "์ƒˆ ์˜์ƒ์ด ์—…๋กœ๋“œ ๋˜๋ฉด ์•Œ๋ฆผ" ์ด๊ฒ ์ฃ ?

Observable๋ฅผ ๊ตฌ๋…ํ•  ๋•Œ ๋ฐ”๋ผ๋Š” ์ ์€ ์ €๊ธฐ event ์ž๋ฆฌ์— ํด๋กœ์ € ํ˜•ํƒœ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘!! ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”

 

๊ทธ๋Ÿผ Observable์ด ์ด์ œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•ด์•ผ๊ฒ ์ฃ ? ์˜์ƒ ์—…๋กœ๋“œ์™€ ๊ฐ™์€ ํ–‰์œ„๋ฅผ์š”!

๊ทธ๋•Œ์˜ Observable์„ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”

var jennie : Observable<String> = Observable.create { observer in
    observer.onNext("์ƒˆ๋กœ์šด ์˜์ƒ ์—…๋กœ๋“œ")

    return Disposables.create()
}

 

์•„๊นŒ ์œ„์— ๊ทธ๋ฆผ์—์„œ ์ƒˆ๋กœ์šด ์˜์ƒ ์—…๋กœ๋“œ -> onNext()๋กœ ๋ฐ”๋€Œ์—ˆ์ž–์•„์š”!

observer.onNext()๋ผ๊ณ  ํ•˜๋ฉด ์˜ต์ €๋ฒ„์—๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•˜๋Š”๊ฑฐ์—์š”! ๋‚ด๊ฐ€ ์ง€๊ธˆ ๋ญ”๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค๋Š” ๊ฒƒ์„์š”!!

์ด ์ฝ”๋“œ๋Š” "์ƒˆ๋กœ์šด ์˜์ƒ ์—…๋กœ๋“œ"๋ผ๋Š” ๋ฌธ์ž์—ด์„ ์˜ต์ €๋ฒ„์—๊ฒŒ ๋ณด๋‚ธ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค

 

๊ทธ๋Ÿผ ์œ„์—์„œ ๋งํ•œ subscirbe์— ์ œ๋‹ˆ๋ฅผ ๊ตฌ๋…ํ–ˆ์„ ๋•Œ์˜ ํ–‰์œ„๋ฅผ ์ž์„ธํžˆ ์ž‘์„ฑํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

jennie.subscribe(onNext: {
    print("\($0)")
}).disposed(by: disposeBag)

disposed()๋Š” ๋†”๋‘๊ณ  ํ•ด์„ํ•˜๋ฉด

์ œ๋‹ˆ๋ฅผ ๊ตฌ๋…ํ• ๊ฑด๋ฐ onNext()์ด๋ฒคํŠธ๊ฐ€ ์˜ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ print๋ฅผ ํ•ด์ค˜

๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค!!

์—ฌ๊ธฐ์„œ๋Š” "์ƒˆ๋กœ์šด ์˜์ƒ ์—…๋กœ๋“œ" ๋ฌธ์ž์—ด์ด ์˜ค๋ฉด print๋ฅผ ํ•ด์ค˜๋ผ๊ณ  ํ•ด์„ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?!

์‹คํ–‰ํ•ด๋ณด๋ฉด subscribeํ•˜์ž๋งˆ์ž ๋ฐ”๋กœ ์ƒˆ๋กœ์šด ์˜์ƒ ์—…๋กœ๋“œ๊ฐ€ print ๋ผ์š”..?

๊ตฌ๋… ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด subscribeJennie()์‹คํ–‰

UI ์ฝ”๋“œ๋Š” ๋ณธ๋ฌธ๊ณผ ๋ณ„๋กœ๊ด€๊ณ„๊ฐ€ ์—†์–ด์„œ ์ƒ๋žตํ• ๊ฒŒ์š” ใ…Žใ…Ž!

???

๋ญ”๊ฐ€ ์ด์ƒํ•˜์ง€ ์•Š๋‚˜์š” ???

์ œ๋‹ˆ๊ฐ€ ๋‚˜์ค‘์— ์˜์ƒ์„ ์—…๋กœ๋“œ ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ์ œ๋‹ˆ๋ฅผ ๊ตฌ๋…ํ•˜์ž๋งˆ์ž ์ƒˆ๋กœ์šด ์˜์ƒ์„ ์—…๋กœ๋“œ ํ–ˆ๋‹ค๊ณ  ํ•˜์ž–์•„์š”?!

๊ทธ ์ด์œ ๋Š” create์•ˆ์— onNext๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—์š”

์ œ๋‹ˆ๋ฅผ ๊ตฌ๋…์„ ํ•˜์ž๋งˆ์ž create์•ˆ์— ์žˆ๋Š” onNext()๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฑฐ์ฃ !

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด,

subscribe() -> create์•ˆ์— ์ž‘์„ฑํ•œ ๋‚ด์šฉ ์‹คํ–‰ !!

๊ทผ๋ฐ Obervable์€ ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์ž–์•„.. create์•ˆ์— onNext()๊ฐ€ ์žˆ๋Š”๊ฑฐ์ž–์•„... ๋ฐ–์— ์žˆ์„ ์ˆ˜๊ฐ€ ์—†์ž–์•„...

๊ทผ๋ฐ ๊ตฌ๋…์€ ํ•ญ์ƒ ๋ฐ”๋กœ๋ฐ”๋กœ ์‹คํ–‰๋˜๋ฉด ์•ˆ๋˜๋Š”๊ฑฐ์ž–์•„!

 

๊ทธ๋Ÿผ delayํ•˜๋ฉด ๋˜์ž–์•„!

var jennie : Observable<String> = Observable.create { observer in
    DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + 3 ) {
        observer.onNext("์ƒˆ๋กœ์šด ์˜์ƒ ์—…๋กœ๋“œ")
    }
    return Disposables.create()
}

์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ๊ตฌ๋…ํ•˜๊ณ  3์ดˆ๋’ค์— ์ƒˆ๋กœ์šด ์˜์ƒ์„ ๋ฌด์กฐ๊ฑด ์—…๋กœ๋“œ ํ•˜๋Š”๊ฑฐ์ž–์•„์š”.. ์ •ํ•ด์ง„ ์‹œ๊ฐ„ ๋ง๊ณ  ์ œ๋‹ˆ๊ฐ€ ์—…๋กœ๋“œ ํ•˜๊ณ  ์‹ถ์„๋•Œ ํ•ด์ฃผ๋ž€ ๋ง์ด์•ผ

 

Subject

์šฐ๋ฆฌ๋Š” subject๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‚˜์ค‘์—!!! ์ƒˆ๋กœ์šด ์˜์ƒ ์—…๋กœ๋“œ๋ฅผ ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”

 

subject์—๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ ๊ทธ ์ค‘์—์„œ PublishSubject๋ฅผ ์จ๋ณผ๊ฒŒ์š”

์™œ๋ƒํ•˜๋ฉด ์œ ํŠœ๋ธŒ ๊ตฌ๋… ์›๋ฆฌ๋ž‘ ๋งค์šฐ ๋น„์Šทํ•˜๊ฑฐ๋“ ์š” ใ…Žใ…Žใ…Ž

๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ๊ตฌ๋…ํ•œ ์‹œ์ ๋ถ€ํ„ฐ ๋ฐœ์ƒํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ „๋‹ฌ์„ ํ•˜๋Š”๊ฑฐ์—์š”! 

 

var jennie : PublishSubject<String> = PublishSubject()

 

 

๊ตฌ๋…ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋˜‘๊ฐ™์•„์š”

๊ทธ๋ฆฌ๊ณ  upload๋ฒ„ํŠผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์ค„๊ฒŒ์š”

(UI ์ฝ”๋“œ๋Š” ์•Œ์•„์„œ..ใ…Žใ…Ž)

๋ฒ„ํŠผ์€ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ• ๊ฑฐ์—์š”

@objc func tapButton() {
    jennie.onNext("์ƒˆ๋กœ์šด ์˜์ƒ ์—…๋กœ๋“œ") //Observable์™ธ๋ถ€์—์„œ onNext()์‹คํ–‰
}

 

๊ทธ๋Ÿฌ๋ฉด!! ๊ตฌ๋…ํ•˜๊ณ , ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ƒˆ๋กœ์šด ์˜์ƒ ์—…๋กœ๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋˜๊ฒ ์ฃ  ?!

๊ตฌ๋… ์•ˆํ•˜๋ฉด ๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ๋„ ์•ˆ๋‚˜์™€์š”

 

 

Observable์€ ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜๋ฅผ ๊ตฌ๋…ํ•˜๋ฉด create์•ˆ์— onNext()๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€๋งŒ,
Subject๋Š” ๊ตฌ๋…ํ•ด๋‘” ์ฑ„๋กœ ์žˆ๋‹ค๊ฐ€ onNext()๊ฐ€ ์™ธ๋ถ€์—์„œ ๋‚˜์ค‘์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฑฐ

 

 

์œ„์— ์žˆ๋˜ ๊ทธ๋ฆผ์—์„œ Observable -> Subject ํ•ด์ค„๊ฒŒ์š”

 

์ด์ œ ์ด ๊ทธ๋ฆผ์ด ๋Œ€์ถฉ.. ์ดํ•ด๊ฐ€ ๋ ๊นŒ์š” ..?

๋ณธ๊ฒฉ์ ์ธ Rx๋Š” ์‹œ์ž‘๋„ ์•ˆํ•œ๊ฑฐ์ง€๋งŒ ๋А๋‚Œ๋งŒ ์•Œ์•„๋ณด๊ณ  ๊ฐ€๋Š”๊ฑธ๋กœ ํ•ด์š” ๐Ÿ™ƒ

 

 

ํ‹€๋ฆฐ๋‚ด์šฉ์ด๋‚˜ ํ”ผ๋“œ๋ฐฑ์žˆ์œผ๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :)

 

 

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ“ฑ iOS > Base' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift] ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ NetworkManager๋งŒ๋“ค๊ธฐ (feat. Generic)  (3) 2023.05.05
[Swift] ์„œ๋ฒ„์— iOS ์ด๋ฏธ์ง€ ๋ณด๋‚ผ ๋•Œ ์šฉ๋Ÿ‰ ์ด์Šˆ & ํ•ด๊ฒฐ  (0) 2023.03.23
[Swift] json value type์ด ๋‹ฌ๋ผ์ง€๋Š” response์— ๋Œ€์‘ํ•˜์—ฌ API Responder๋งŒ๋“ค๊ธฐ  (0) 2023.02.12
[Swift] Custom Calendar ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚  ๊ตฌํ•˜๊ธฐ  (0) 2023.01.16
[Stanford iOS] ์•„ํ‚คํ…์ฒ˜ & MVC  (0) 2022.05.05
    '๐Ÿ“ฑ iOS/Base' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Swift] ์„œ๋ฒ„์— iOS ์ด๋ฏธ์ง€ ๋ณด๋‚ผ ๋•Œ ์šฉ๋Ÿ‰ ์ด์Šˆ & ํ•ด๊ฒฐ
    • [Swift] json value type์ด ๋‹ฌ๋ผ์ง€๋Š” response์— ๋Œ€์‘ํ•˜์—ฌ API Responder๋งŒ๋“ค๊ธฐ
    • [Swift] Custom Calendar ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚  ๊ตฌํ•˜๊ธฐ
    • [Stanford iOS] ์•„ํ‚คํ…์ฒ˜ & MVC
    sladuf
    sladuf

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”