observable์ subscription๋๊ธฐ ์ ๊น์ง ์๋ฌด๋ฐ ์ด๋ฒคํธ๋ ๋ฐฉ์ถํ ์ ์๋ค -> ์๋ฌด๊ฒ๋ ํ ์ ์์
subscription์ด ์ต์ ๋ฒ๋ธ์ด ๋์ํ๋๋ก ์๋ก์ด ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๋๋ก ํ๊ณ .error ํน์ .completed ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๊ฒ ํ๋ฉฐ ์ข ๋ฃ์ํค๊ฒ ํ๋ ํธ๋ฆฌ๊ฑฐ ๊ฐ์ ์ญํ์ ํ๋ ๊ฒ!
๊ทธ๋ ๋ค๋ฉด ๋์ด์ ์ต์ ๋ฒ๋ธ์ด ํ์ ์์ด์ง๊ฑฐ๋ ๋ ์ด์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๊ณ ์ถ์ง ์๋ค! ํ ๋๋ ์ ํ๋ธ ์ฒ๋ผ ๊ตฌ๋ ์ทจ์ ํ ์ ์์
์ด๊ฑธ ์ํ ํ๋ ๊ฒ์ด Disposing์ ๊ฐ๋ ์ด๊ณ observable์ ์ฆ์ ์ข ๋ฃ๋๋ค!
$0์ default argument๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฑธ ์ฒ์ ์์๋น. ์ฑ ์์์ ํํ์ธ๊ฐ?
let disposeBag = DisposeBag()
์ด๋ ๊ฒ DisposeBag์ ์์ฑํ์ฌ ํ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค
observable์ ๊ตฌ๋ ํ๋ subscribe๋ ๋ฆฌํด์ผ๋ก Disposable์ ๋ฐํํ๋ค. DisposeBag์ ์ด๋ฌํ Disposable์ ๋ด์ ํ ๋นํด์ ์ ๊ฐ๊ฐ์ ๋ํด dispose() ๋ฅผ ํธ์ถ ํ ์ ์์
์ dispose๋ฅผ ํด์ค์ผ ํ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ผ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค ์์ง ๋ง์ด ๋ฐฐ์ฐ์ง ์์์ ์ ๋ชจ๋ฅด๊ฒ ๋๋ฐ ์๋ง๋ ์ด๊ฑธ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉํ ์ ์๋๋ณด๋ค ๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์งํ๊ณ ํ ๋นํ๋ ๊ฒ์ ๊ฐ๋ฐ์์๊ฒ dispose๋ก ์ ๊ณตํ๋ ๊ฒ ๊ฐ์๋ฐ ๋คํํ swift compiler๊ฐ ์ด๋์ ๋ ์๋ ค์ค๋ค๊ณ ํ๋ค!
๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ผ์ด๋ ์ ์๋ ์ํฉ์
DisposeBag์๋ค๊ฐ subscribe๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์์์ ๊ฒฝ์ฐ
subscribe๋ฅผ ๋ง์น ํ ์๋์ผ๋ก ์ญ์ ๋ฅผ ํธ์ถ <- ์ด๊ฑด ๋ฌด์จ ๋ป์ผ๊น..
๋ค๋ฅธ point์์ observable์ด ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ
์คํผ๋ ์ดํฐ ๊ณต๋ถํ๋๋ฐ ๋์์ ์ฃผ๋ ์ฌ์ดํธ
https://reactivex.io/documentation/operators.html
ReactiveX - Operators
Introduction Each language-specific implementation of ReactiveX implements a set of operators. Although there is much overlap between implementations, there are also some operators that are only implemented in certain implementations. Also, each implementa
reactivex.io
create ์คํผ๋ ์ดํฐ
Observable์ ์์ฑํ๋ Operator
๋ค๋ฅธ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ์ง์ ์ ์ธ ์ฝ๋ ๊ตฌํ์ ํตํด ์ต์ ๋ฒ๋ฅผ ๊ตฌํํ๋ค subscribers์๊ฒ ์ ์ก๋ ๋ชจ๋ '์ด๋ฒคํธ'๋ฅผ ์ ์ํ ์ ์๋ค.
subscribe ์ฒ๋ผ ๋ณด์ด์ง๋ง Observable์ ์์ฑํ๊ธฐ ๋๋ฌธ์ subscriber ์์ด๋ ์ด๋ ํ ์ด๋ฒคํธ๋ ๋ฐฉ์ถ๋์ง ์๋๋ค! disposable์ ์ง์ ๋ฆฌํดํด์ฃผ์ด์ผ ํ๋ค!
Observable<String>.create { observer in
// subscriber๊ฐ ๋ฐฉ์ถํ ์ด๋ฒคํธ๋ฅผ ์ ์ํ ์ ์์
observer.onNext("cat")
observer.onError(CustomError.testError)
observer.onCompleted()
observer.onNext("dog")
return Disposables.create()
}
.subscribe { event in
print(event)
} onError: { error in
print(error)
} onCompleted: {
print("create observable, Completed")
} onDisposed: {
print("create observable, Disposed")
}.disposed(by: disposeBag)
enum CustomError: Error {
case testError
}
create์คํผ๋ ์ดํฐ์์ subscribe ํ๋ผ๋ฏธํฐ์ ์ธ์๋ก ๋๊ฒจ์ค subscribe ์์ ์ง์ ์ ์ผ๋ก ์ฝ๋ ๊ตฌํ์ ํ ์ ์์ (์ต์ ๋ฒ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ฃผ๋ ๊ฒ)
์ด๋ฅผ ํตํด์ ์ต์ ๋ฒ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ๋๋๋ฐ ๊ฒฐ๊ณผ ๊ฐ์ ๊ทธ๋์ ์ต์ ๋ฒ๋ธ! ์์ฑ๋ ๊ฐ์ ์ต์ ๋ฒ๋ธ ์ํ์ค์ด๋ค
์์ ์ฝ๋์์ terminate ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๋ ๊ฑธ ์ ์ ์๋๋ฐ error์ ํธ์ถํ๊ณ completed ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ฒฐ๊ณผ๋ .completed ์ด๋ฒคํธ๋ ๋ฐฉ์ถ๋์ง ์๋๋ฐ .error ์ด๋ฒคํธ ๋ฐฉ์ถ๋ ํ ๋ฐ๋ก terminated ๋๊ธฐ ๋๋ฌธ์ด๋ค!
๋ง์ฝ terminate์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ์ง ์์ผ๋ฉด ์ ๋ dispose ๋์ง ์์ผ๋ฏ๋ก completed ์ด๋ฒคํธ๋ disposeBag์ ์ถ๊ฐํด ์ฃผ๋ฉด ๋๋ค
Observable ์ ์ ํ ๋ค๋ฅธ ๊ณณ์์ subscribe ํ๋ฉด ๋ด๊ฐ create์์ ์ ์ํ ์ด๋ฒคํธ๋ฅผ ์์๋๋ก ๋ฐฉ์ถ ์ํฌ ์ ์๊ณ terminate ์ํฌ ์๋ ์๋ ๊ฒ! ๊ต์ฅํ ์ข์ ๊ธฐ๋ฅ์ด๋ค! ์ ๊ธฐ์กด ํ๋ก์ ํธ ์์ฑํ ํ์ ์์ด ๋ฆฌํฉํ ๋ง ํด๋ ๋๋ค ํ์ง ์๊ฒ ๊ฐ๋ค. ์ ์ ํ ๊ณณ์๋ค๊ฐ rx๋ก ๋ก์ง ์ถฉ๋ถํ ์งค ์ ์์ ๊ฒ ๊ฐ๋ค
Observable Factories
ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ๋งํผ์ ๋ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค๊ณ ํ๋ค Rx์์ ํฉํ ๋ฆฌ๋ ์ธํ์ ์ต์ ๋ฒ๋ธ๋ก ๋ณํ์์ผ ์ฃผ๊ธฐ ๋๋ฌธ์ Operator๋ก ๊ฐ์ฃผ๋๋ค
RxSwift์์ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ์คํผ๋ ์ดํฐ๋ differ ๋ก ๊ตฌํ๋๋๋ฐ ์ธํ๊ณผ ์์ํ์ด ๊ธฐ์กด์ ๋ดค๋ ์คํผ๋ ์ดํฐ์ ์ข ๋ค๋ฅด๋ค
๋ฐํ๊ฐ์ ๋ณด๋ฉด observable์ด๋ค ์ฆ ์ต์ ๋ฒ๋ธ์ ์์ฑํ๋๋ฐ ์ง์ ์ต์ ๋ฒ๋ธ์ ๋ฐํํด ์ค๋ค๋ ๊ฒ
ํ๋ผ๋ฏธํฐ๋ก๋ observableFactory๋ฅผ ์ง์ ํด ์ฃผ์ด์ผ ํ๋๋ฐ Observable ํฉํ ๋ฆฌ
๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง Observable์ ๊ตฌ๋ ํ๋ ๊ฒ์ด ์๋ ๊ตฌ๋ ์์ ์์ผ Observable์ ๋ง๋ฌ
์ ํ์ ์ธ ํฉํ ๋ฆฌ ํจ์๋ --> subscribe ๋๊ธฐ ์ ๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๊ตฌ๋ ์ด ๋๋ฉด Observable ์์ฑ
์ด deferred ์คํผ๋ ์ดํฐ๋ก ์์ฑ๋ Observable์ ๊ตฌ๋ ํ๋ subscribe ๋ง๋ค deferred์ observableFatory๋ก ์ ๋ฌํ ๊ฒ์ด ์๋กญ๊ฒ ์คํ๋๋ ๊ฒ, ์ฆ ์ฌ๋ฌ ๊ตฌ๋ ์๊ฐ ๋์ผํ Observable์ ๊ฐ์ ํ๊ณ ์๋ค๊ณ ์๊ฐ๋ ์ ์์ผ๋ ์ฌ์ค์ ๊ฐ๋ณ ์ํ์ค๋ฅผ ๊ฐ์ง ( โญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธ)
๊ทธ๋ฆผ์์ ์ ์ ์๋ฏ์ด ๊ฐ subscribe ๋ณ๋ก ๋ค๋ฅธ ์ํ์ค๋ฅผ ๊ฐ์ง๋ค! ํ๋์ Observable์ ๊ฐ์ง๊ณ ๋๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐ๋ ๊ฒ์ด ์๋ ๊ฐ๋ณ ์ํ์ค!!
์ด์ฏค์์ ์ํ์ค๋ Observable์ด ๋งค์ฐ ํท๊ฐ๋ฆฌ๋๋ฐ Observable์ ์ผ๋ จ์ Sequence(์์)๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ์ด ์์๋๋ก ๊ตฌ๋ ํ ๋์์๊ฒ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ ๊ฒ
everything is sequence!
๊ด์ฐฐ์ ํจํด์ธ Observable<Element> ์ํ์ค์ ์ผ๋ฐ์ ์ธ ์ํ์ค์ ๊ฐ๋ ์ด ๊ฐ์
Observable์ ์ผ๋ จ์ ์์๋๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๊ฒ ๋๋๋ฐ ๊ทธ๋ ๊ธฐ์ Observable์ด sequence์ ๊ฐ์ ๊ฐ๋ ์ผ๋ก ์ฐ์ผ ์ ์๋ ๊ฒ์
let disposeBag = DisposeBag()
var hasNewImageUpdated = false
let factory: Observable<String> = Observable.deferred {
hasNewImageUpdated.toggle()
if hasNewImageUpdated {
return Observable.of("image1.jpg", "image2.jpg")
} else {
return Observable.of("newUpdatedImage.jpg")
}
}
for _ in 0...3 {
factory.subscribe(onNext: { element in
print(element, terminator: ", ")
}).disposed(by: disposeBag)
print()
}
๋ฌธ์ ์ ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!!
์ฐธ๊ณ ์ฌ์ดํธ ๋ฐ ๋์ :
https://medium.com/tompee/rxjava-ninja-observable-factories-part-1-98c97f6db853
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] Subject ์์๋ณด๊ธฐ (0) | 2022.01.09 |
---|---|
[RxSwift] Traits ์ side effect & Subject ๊ธฐ๋ณธ (0) | 2022.01.07 |
[RxSwift] Observable, Operators ๊ทธ๋ฆฌ๊ณ subscribe (0) | 2022.01.05 |
[iOS/Swift] Custom Font ์ฌ์ฉํ๊ธฐ (1) | 2021.12.19 |
[Swift] RIBs Architecture ๊ฐ์์ ํ ํ๋ฆฟ ์ค์ (0) | 2021.11.12 |
๋๊ธ