RxSwift ๊ฐ๋ ์ ๋ฆฌ๊ธ์์ RxSwift์ ์ ์์ ๋ํด ์ ๋ฆฌํด๋ณด๋ฉฐ,
Observable์ด ๋ฐ์ํ(Reactive) ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ฅ ํฐ ํต์ฌ์ด๋ค. ๋ผ๊ณ ์ ๋ฆฌํ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ์ค์ํ ๊ฐ๋ ! Observable์ด ๋ฌด์์ธ์ง, ์ด๋ป๊ฒ ๋ง๋๋์ง, ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง์ ๋ํด์ ์ข ๋ ์์ธํ ์์๋ด ์๋ค!
Observable
Observable์ ๊ฐ๋ ๋ถํฐ ๋ค์ ๊ฐ์ ธ์์ ์ค๋ช ํด๋ณด์๋ฉด,
ReactiveX์์ Observable ๊ฐ์ฒด๋ ์ฌ์ ์ ์ธ ์๋ฏธ๋๋ก ์ด๋ค '๊ฐ์ฒด'๋ฅผ ๊ด์ฐฐํ ์ ์๋ ํํ๋ก ๋ง๋๋ ๊ฒ์ ๋งํ๋ฉฐ,
Observable ๊ฐ์ฒด๋ฅผ ์์ฑํจ์ผ๋ก์จ Observer๋ ๊ด์ฐฐ์ ์์(๊ตฌ๋ )ํ๊ฒ ๋ฉ๋๋ค.
์ด '๊ฐ์ฒด'์ ๋ฐ๋ผ ์ค์ ๊ด์ฐฐํ๋ ๊ฐ(== ์คํธ๋ฆผ์ ํ๋ ค๋ณด๋ด๋ ๊ฐ) ํน์ ๊ด์ฐฐ์ ๋์์ธ ์ฌ๊ฑด(== ์ด๋ฒคํธ)์ด ๊ฒฐ์ ๋ฉ๋๋ค.
์ฆ, Observable์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ํ๋ฆ์ ๋๋ค. Observer๊ฐ Observable์ ๊ตฌ๋ ํ๊ณ , Observable์ด ๋ฐฉ์ถํ๋ ์ด๋ฒคํธ์ ๋ฐ์ํ๋ ๊ฒ์ด ๋ฐ์ํ(Reactive) ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ฅ ํฐ ํต์ฌ์ด๋ผ๊ณ ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
observable, observable sequence, sequence๋ผ๋ ํํ์ ์ฐ๋๋ฐ ์ฌ์ค ๋ค ๊ฐ์ ๋ง์ ๋๋ค.
์ค์ํ ๊ฒ์ ์ด๋ฒคํธ๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์์ฑ๋๋ค๋ ๊ฒ์ ๋๋ค!
observable์ ์ผ์ ๊ธฐ๊ฐ ๋์ ๊ณ์ํด์ ์ด๋ฒคํธ๋ฅผ ์์ฑํด ์คํธ๋ฆผ์ ํ๋ ค๋ณด๋ด๋๋ฐ, ์ด๋ฌํ ๊ณผ์ ์ ๋ฐฉ์ถ(emit)์ด๋ผ๊ณ ํฉ๋๋ค.
๋ํ ๊ฐ๊ฐ์ ์ด๋ฒคํธ๋ค์ ์ซ์๋ ์ปค์คํ ํ ์ธ์คํด์ค๋ฑ๊ณผ ๊ฐ์ ๊ฐ์ ๊ฐ์ง ์ ์๊ณ , ๋๋ ํญ๊ณผ ๊ฐ์ ์ ์ค์ฒ์ผ ์๋ ์์ต๋๋ค.
์ด๋ฒคํธ๋ฅผ ์ด๋ป๊ฒ ์์ฑํด์ ์ด๋ป๊ฒ ํ๋ ค๋ณด๋ด๋ ๊ฑฐ์ง?? ๊ธ๋ก๋ง ๋ด์๋ ์ดํด๊ฐ ์ ๊ฐ์ง ์์ต๋๋ค.๐ฅบ๐ญ
์ด๋ฌํ ๊ฐ๋ ๋ค์ ๊ฐ์ฅ ์ ์ดํดํ ์ ์๋ ๋ฐฉ๋ฒ์ marble diagrams๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค. (๊ทธ๋ฆผ์ผ๋ก ์ฝ๊ฒ ๋ด ์๋ค!)
- marble diagram: ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ์ ๊ฐ์ ํ์ํ๋ ๋ฐฉ์
- ์๊ฐ์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ๋ฅธ๋ค๋ ๊ฐ์
- ์ฐธ๊ณ ํ๋ฉด ์ข์ ์ฌ์ดํธ: RxMarbles
Observable์ ์๋ช ์ฃผ๊ธฐ
observable์ ์๋ช ์ฃผ๊ธฐ๋ฅผ marble diagram์ ํตํด ์์๋ด ์๋ค!
์ต์ ๋ฒ๋ธ์๋ next, completed, error ์ด๋ ๊ฒ ์ธ๊ฐ์ง ๊ตฌ์ฑ์์๊ฐ ์์ต๋๋ค. ํ๋์ฉ ์ดํด๋ณผ๊ฒ์!
1. next
next ์ด๋ฒคํธ๋ฅผ ํตํด ๊ฐ๊ฐ์ ์์๋ค์ ๋ฐฉ์ถํฉ๋๋ค.
2. completed
์ธ ๋ฒ์ tap ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ ๋ค ์ด๋ฒคํธ๋ค์ด ๋ค ๋ฐฉ์ถ๋๋ฉด ์์ ์ข ๋ฃ๋ฉ๋๋ค. ์ด๋ completed ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ๊ฒ์ ๋๋ค.
3. error
error ์ด๋ฒคํธ๋ ๋ฐฉ์ถ ํ, ์์ ์ข ๋ฃ๋๋ ์ด๋ฒคํธ์ ๋๋ค. ํ์ง๋ง ์๋ฌ๊ฐ ๋ฐ์๋์์ ๋๋ error ์ด๋ฒคํธ๋ฅผ ํตํด ์ข ๋ฃ๋ฉ๋๋ค.
Observable ๋ง๋ค๊ธฐ
observable ์์ฑ ์ฐ์ฐ์๋ฅผ ์ด์ฉํด observable์ ๋ง๋ค ์ ์์ต๋๋ค.
just, of, from, empty, never, range, repeatElement, interval, create ๋ฑ ๋ค์ํ ์์ฑ ์ฐ์ฐ์๋ค์ด ์๋๋ฐ์,
์ด ๊ฒ์๋ฌผ์์๋ ๊ฐ์ฅ ๋ํ์ ์ธ just, of, from์ ๋ํด์๋ง ์์ธํ ๋ณด๋๋ก ํ ๊ฒ์!
์์ ์ฝ๋์์๋ ์ฐ์ฐ์์ ๋ํ ์ดํด๋ฅผ ๋๊ธฐ ์ํด subscribe๊น์ง ํด์ ์ถ๋ ฅ๊น์ง ํด๋ณด๊ณ , ๋ค์์ subscribe์ ๋ํด
์์ธํ ์ ๋ฆฌํ๋๋ก ํ๊ฒ ์ต๋๋ค!
just
์ค์ง ํ๋์ Element๋ฅผ ํฌํจํ๋ Observable Sequence๋ฅผ ์์ฑํฉ๋๋ค.
let observable1 = Observable.just([1, 2, 3])
observable1.subscribe {
print($0)
}
// ์ถ๋ ฅ ๊ฒฐ๊ณผ
// next([1, 2, 3])
// completed
- just๋ Observable์ ํ์ ๋ฉ์๋์ ๋๋ค.
- ์ด๋ฆ์์ ์ถ์ธกํ ์ ์๋ฏ, ์ค์ง ํ๋์ ์์๋ฅผ ํฌํจํ๋ Observable sequence๋ฅผ ์์ฑํฉ๋๋ค.
of
๊ฐ๋ณ์ ์ธ element๋ฅผ ํฌํจํ๋ Observable Sequence๋ฅผ ์์ฑํฉ๋๋ค.
let observable2 = Observable.of(1, 2, 3)
observable2.subscribe { event in
print(event)
}
// ์ถ๋ ฅ ๊ฒฐ๊ณผ
// next(1)
// next(2)
// next(3)
// completed
- element๊ฐ ๋ง์ง๋ง observable2์ ํ์ ์ ๋ฐฐ์ด์ด ์๋ Observable<Int> ํ์ ์ ๋๋ค.
- .of ์ฐ์ฐ์๋ ์ฃผ์ด์ง ๊ฐ๋ค์ ํ์ ์ถ๋ก ์ ํตํด Observable sequence๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ฐ๋ผ์, ์ด๋ค array๋ฅผ observable array๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, array๋ฅผ .of ์ฐ์ฐ์์ ์ง์ด ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
let observable3 = Observable.of([1, 2, 3])
observable3.subscribe {
print($0)
}
// ์ถ๋ ฅ ๊ฒฐ๊ณผ
// next([1, 2, 3])
// completed
- observable3์ ํ์ ์ Observable<[Int]>
- ์ด๋ ๊ฒ ํ๋ฉด just ์ฐ์ฐ์๋ฅผ ์ด ๊ฒ๊ณผ ๊ฐ์ด [1,2,3]๋ฅผ ๋จ์ผ์์๋ก ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
from
array์ ์์๋ค๋ก Observable Sequence ์์ฑํฉ๋๋ค.
let observable4 = Observable.from([1,2,3])
observable4.subscribe { event in
print(event)
}
// ์ถ๋ ฅ ๊ฒฐ๊ณผ
// next(1)
// next(2)
// next(3)
// completed
- observable4์ ํ์ ์ Observable<Int>
- from ์ฐ์ฐ์๋ ์ผ๋ฐ์ ์ธ array ๊ฐ๊ฐ ์์๋ค์ ํ๋์ฉ ๋ฐฉ์ถํฉ๋๋ค.
- from ์ฐ์ฐ์๋ ์ค์ง array ๋ง ์ทจํฉ๋๋ค.
Observable ๊ตฌ๋ ํ๊ธฐ
์ ์ฝ๋๋ค์์ ์์ฑํ Observable์ subscribe ๋ฉ์๋๋ฅผ ํตํด ๊ตฌ๋ ์ ํด์ผ๋ง ์ด๋ฒคํธ๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Observable์ ์ค์ ๋ก sequence์ ์ ์์ผ ๋ฟ, Observer๊ฐ subscribeํ์ง ์๋๋ค๋ฉด ์๋ฌด๋ฐ ์ด๋ฒคํธ๋ ๋ด๋ณด๋ด์ง ์์ต๋๋ค. Subscribe๋ observable์ stream(๋ฐ์ดํฐ ํ๋ฆ)์ ๊ด์ฐฐํ๊ณ ๊ตฌ๋ ํ๋ ์ญํ ์ ํฉ๋๋ค.
์ฌ๊ธฐ์ ๊ตฌ๋ ์ ํ๋ ์ฃผ์ฒด๋ observer, ๊ตฌ๋ ๋์์ observable ์ ๋๋ค!
๊ตฌ๋ ํ๋ ๋ฐฉ๋ฒ
Observable์ ๊ตฌ๋ ํ๊ณ ์ถ์ ๋ subscribe()๋ฅผ ์ด์ฉํด ๊ตฌ๋ ์ ์ ์ธํฉ๋๋ค.
์ด๋, Observable์ด ๋ฐฉ์ถํ๋ ๊ฐ๊ฐ์ ์ด๋ฒคํธ ํ์ ์ ๋ํด์ handler(์ด๋ค ์ผ์ด ๋๋ฌ์ ๋ ์งํํ ์ผ์ ๋ด๋นํ๋ ์น๊ตฌ)๋ฅผ
์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ตฌ๋ ์ ํ๊ฒ ๋๋ฉด, ์์์ ๋ณธ ๊ฒ ์ฒ๋ผ Observable์ .next, .error, .completed ์ด๋ฒคํธ๋ค์ ๋ฐฉ์ถํ๊ฒ ๋ฉ๋๋ค.
- .next๋ handler๋ฅผ ํตํด ๋ฐฉ์ถ๋ ์์๋ฅผ ํจ์คํ ๊ฒ์ ๋๋ค.
- .error๋ error ์ธ์คํด์ค๋ฅผ ๊ฐ์ง ๊ฒ์ ๋๋ค.
.subscribe()
.subscribe๋ escaping ํด๋ก์ ๋ก, Intํ์ ์ ๊ฐ์ด event๋ก ์ ๋ฌ๋ฉ๋๋ค. (์ด ์์ ์์๋ Observable<Int>๋ก ๋ณด๊ณ ์์ผ๋! )
escaping์ ๋ํ ๋ฆฌํด๊ฐ์ ์์ผ๋ฉฐ(Void), .subscribe์ Disposable์ ๋ฆฌํดํฉ๋๋ค.
์์์ ์์ ์ฝ๋ ํ๋๋ง ๋ค์ ๊ฐ์ ธ์์ ์ดํด๋ด ์๋ค!
let observable4 = Observable.from([1,2,3])
observable4.subscribe { event in
print(event)
}
// ์ถ๋ ฅ ๊ฒฐ๊ณผ
// next(1)
// next(2)
// next(3)
// completed
ํ๋ฆฐํธ๋ ๊ฐ์ ๋ณด๋ฉด, Observable์ ๊ฐ๊ฐ์ ์์๋ค์ ๋ํด์ .next ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๋ฉฐ, ์ต์ข ์ ์ผ๋ก .completed๋ฅผ ๋ฐฉ์ถํฉ๋๋ค.
Observable์ ์ด์ฉํ๋ค๋ณด๋ฉด, ๋ฐฉ์ถ๋ ๊ฐ์ ๊ฐ์ง๊ณ ์ํ๋ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ Observable์ด .next ์ด๋ฒคํธ๋ฅผ ํตํด ๋ฐฉ์ถํ๋ ์์์ ๊ฐ์ฅ ๊ด์ฌ๊ฐ์ง๊ฒ ๋ ๊ฒ์ ๋๋ค.
observable.subscribe { event in
if let element = event.element {
print(element)
}
}
/* Prints:
1
2
3
*/
์์ ๊ฐ์ด ๊ฐ์ ๋ฐ์ ์๋ ์๊ฒ ์ง๋ง,
์์ฃผ ์์ฃผ ์ฐ์ด๋ ํจํด์ด๊ธฐ ๋๋ฌธ์ RxSwift์๋ ์ด ๋ถ๋ถ์ ๋ํ ์ถ์ฝํ๋ค์ด ์์ต๋๋ค.
Observable์ด ๋ฐฉ์ถํ๋ .next ์ด๋ฒคํธ๋ฅผ ์ฝ๊ฒ ๋ฐ์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ .onNext subscribe์ฐ์ฐ์์ ๋ํด ์ดํด๋ด ์๋ค.
.subscribe(onNext: )
.onNext ํด๋ก์ ๋ฅผ ์ด์ฉํด ์์ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ๋ฐ๊ฟ ์ ์์ต๋๋ค.
observable.subscribe(onNext: { (element) in
print(element)
})
/* Prints:
1
2
3
*/
.onNext ํด๋ก์ ๋ .next ์ด๋ฒคํธ๋ง์ ์ ๋ฌ์ธ์๋ก ๋ฐ์ ํธ๋ค๋งํ๊ณ , ๋ค๋ฅธ ๊ฒ๋ค์ ๋ชจ๋ ๋ฌด์ํ๊ฒ ๋ฉ๋๋ค.
Observable ๊ตฌ๋ ์ทจ์ํ๊ธฐ
์ง๊ธ๊น์ง observable์ด ๋ฐฉ์ถํ๋ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํด์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ค๋ ์์ ์ ํ์ต๋๋ค.
์ด๋ฒคํธ๋ฅผ ๋ฐ์์ ์ํ๋ ์ฒ๋ฆฌ๋ ํ๊ณ , ๊ฐ์ ธ๋ค๊ฐ ํ๊ณ ์ถ์๊ฑฐ ๋คํ๋ค๋ฉด??
์ด์ ๊ทธ๋ง..๊ตฌ๋ ์ทจ์๋ฅผ ํด์ผ๊ฒ ์ฃ ? ์ด์ ๋์ค์๋ค..์๋๋ฉด..๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ผ์ด๋๋๊น์..
์ต์ ๋ฒ๋ธ...๋์ฃผ๋๊ฑฐ..๊ทธ๊ฑฐ ์ด์ผ ํ๋๊ฑด๋ฐ..
Observable์ subscription์ ๋ฐ๊ธฐ ์ ๊น์ง ์๋ฌด ์ง๋ ํ์ง ์์ต๋๋ค. (๊ตฌ๋ ์ ๋นํด์ผ ์ด๋ฒคํธ ๋ฐฉ์ถ)
๋ฐ๋ผ์ ๋ฐ๋๋ก ์๊ฐํด๋ณด๋ฉด Observable์ ๋ํ ๊ตฌ๋ ์ ์ทจ์ํจ์ผ๋ก์จ Observable์ ์๋์ ์ผ๋ก ์ข ๋ฃ์ํฌ ์ ์์ต๋๋ค. (๋น๋๊ธฐ ์์ ์ ์ค๊ฐ์ ๋ฉ์ถ๊ณ ์ทจ์ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ ์ ์๊ฒ ์ฃ ?)
์์์ .subscribe๊ฐ disposable์ ๋ฆฌํดํ๋ค๊ณ ํ์ต๋๋ค. (==๋ฆฌํด ๊ฐ์ผ๋ก disposableํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๊ฒ) ๊ตฌ๋ ์ทจ์ ์, ์ disposable์ ์ด์ฉํฉ๋๋ค.
1) .dispose()
์ด๋ค ์์ ์ ์ค๋จํ๊ณ ์ทจ์ํ๊ณ ์ถ๋ค๋ฉด ๊ฐ๋จํ๊ฒ dispose()๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
๊ตฌ๋ ์ ์ทจ์(dispose)ํ ๋ค์๋ ์ด๋ฒคํธ ๋ฐฉ์ถ์ด ์ ์ง๋ฉ๋๋ค.
let observable = Observable.of("A", "B", "C") // ์ต์ ๋ฒ๋ธ ์์ฑ
let subscription = observable.subscribe({ (event) in // ์ต์ ๋ฒ๋ธ ๊ตฌ๋
print(event) // ๋ฐฉ์ถ๋๋ ์ด๋ฒคํธ ํ๋ฆฐํธ
})
subscription.dispose() // dispose()ํธ์ถ๋ก ๊ตฌ๋
์ทจ์!
์ฌ๊ธฐ์ ๋๋ ์๋ฌธ..๐ค
์ด๋ฒคํธ๋ค์ด ๋ค ๋ฐฉ์ถ๋ ํ completed ๋๋ค๊ณ ์์์ ๋งํ๋๋ฐ ์ ๊ตฌ๋ ์ ์๋์ ์ผ๋ก ์ทจ์ํด์ผํ๋๊ฑฐ์ฃ ..??
์์ ์ฝ๋์ ๊ฒฝ์ฐ, observable ์์๋ 3๊ฐ์ ์์๋ง ์์ผ๋ฏ๋ก dispose() ๋ฅผ ํธ์ถํ์ง ์์๋ completed๊ฐ ํ๋ฆฐํธ ๋์ง๋ง
์์๊ฐ ๋ฌดํํ ์๋ค๋ฉด dispose() ๋ฅผ ํธ์ถํด์ผ completed ๊ฐ ํ๋ฆฐํธ ๋ฉ๋๋ค!
2) DisposeBag()
๊ฐ๊ฐ์ ๊ตฌ๋ ์ ๋ํด์ ์ผ์ผํ ๊ด๋ฆฌํ๋ ๊ฒ(์์ฑํ๋ subscription ๋ง๋ค disposeํด์ฃผ๋ ๊ฒ)์ ํจ์จ์ ์ด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์,
RxSwift์์ ์ ๊ณตํ๋ DisposeBag ํ์ ์ ์ด์ฉํ ์ ์์ต๋๋ค. ๋ง ๊ทธ๋๋ก, Disposableํ์ ์ ๋ด์ ์ ์๋ ํด๋์ค์ ๋๋ค.
์ฌ์ฉ๋ฐฉ๋ฒ์??
subscribe()์ ๋ฆฌํดํ์ ์ธ Disposable์์ disposed(by:)๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ฌ์ฉํ ์ ์์ต๋๋ค. (์์ฃผ ์์ฃผ ์ฌ์ฉํ๊ฒ ๋ ํํ์ ๋๋ค)
๋ฐฉ์ถ๋ ๋ฆฌํด๊ฐ๋ค์ disposeBag์ ๋ค ๊ฐ๋ค ๋ฃ์ด๋์ผ๋ฉด, disposeBag์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ๋ชจ๋ ๊ตฌ๋ ์ด ์ทจ์๋ฉ๋๋ค!
disposeBag ์ ์ธ → ์ฌ๋ฌ ์ต์ ๋ฒ๋ธ์ ๋ํ disposable์ disposebag์ ๋ชจ๋ ๋ฃ๊ธฐ → ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ๊ตฌ๋ ์ทจ์
let disposeBag = DisposeBag() // ์ผ๋จ disposeBag์ ๋ง๋ญ๋๋ค.
Observable.of("A", "B", "C") // ์ต์ ๋ฒ๋ธ์ ์์ฑํฉ๋๋ค.
.subscribe{
print($0) // ๋ฐฉ์ถ๋๋ ์ด๋ฒคํธ ํ๋ฆฐํธ
}
.disposed(by: disposeBag) // subscribe๋ก๋ถํฐ ๋ฐฉ์ถ๋ ๋ฆฌํด๊ฐ์ disposeBag์ ์ถ๊ฐํฉ๋๋ค.
[์ฐธ๊ณ ์๋ฃ]
'๐ 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] RxSwift์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ (7) | 2022.04.07 |