ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ฏ RxSwift ์ดํดํ๊ธฐ_04
RxSwift ์ดํดํ๊ธฐ_01 - https://jayb-log.tistory.com/275
RxSwift ์ดํดํ๊ธฐ_02 - https://jayb-log.tistory.com/276
RxSwift ์ดํดํ๊ธฐ_03 - https://jayb-log.tistory.com/277
- ๐ ์ด ๊ธ์ RxSwift์ ๋ํ ์์ฒญ๋ ์ดํด๋ ๋ณธ์ง์ ํ์ ํ๋ค๊ธฐ๋ณด๋ค ์ ๋ฌธํ๋ ์ ์ฅ์์ ์์ฑํ๋ ๊ธ์ด์์! ๊ณฐํ๊น๋์ ๊ฐ์(ํ๋จ์ ๋งํฌ) ๋ฅผ ๋ค์ผ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ, ์๊ฐ๋ค์ ์์ฑํ ์์ ์ด์์. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์ถ๊ฐํ๋ฉด ์ข์ ๋ถ๋ถ์ ๋ํ ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค :]
๐ง๐ปโ๐ป Subscribe ํ๊ธฐ
์ฐ์ ์๋ ์ฝ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋น์ฐํ Stream์ด ๋ฉ๋๋ค.
Observable.just("HelloWorld")
์ด Stream์ ์ต์ข ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋ subscribe๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ :]
Observable.just("HelloWorld") .subscribe()
์ด๋ ๊ฒ ํ๋ฉด "HelloWorld"๊ฐ ๋ด๋ ค์ค๊ณ ๊ทธ๋ฅ ๋๋๊ฒ๋์. ์๋ฅผ ๋ค๋ฉด,
Analytic์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ๋ณด๋ธ ํ ์ด๋ป๊ฒ ๋๋ ์ ๊ฒฝ์ฐ๊ณ ์ถ์ง ์๋ค
๋ผ๋ ์ํฉ์์๋ ์์ ๊ฐ์ด ์ฒ๋ฆฌํ ์ ์๊ฒ ์ฃ .ํ์ง๋ง subscribe์๋ ์ด๊ฒ ์ธ์๋ ๋ค์ํ ์ต์ ์ด ์์ด์.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ on์ด์์.
Observable.just("HelloWorld") .subscribe(on: (Event<String>) -> Void)
on์์ ์ด๋ฒคํธ ํ์ ์ด ์์.
์ด๋ฒคํธ ํ์ ์ enum์ผ๋ก next, error, completed์ 3๊ฐ์ง ํ์ ์ด ์์ด์.
Observable.just("HelloWorld") .subscribe { event in switch event { case .next(let str): break case .error(let err): break case .completed: break } } .disposed(by: self.disposeBag)
๋ค๋ฅธ Operator๋ค์ return type์ด stream์ผ๋ก ๋ชจ๋ Observable์ด์์. ์ ์ผํ๊ฒ subscribe๋ง return ํ์ ์ด disposable์ด์์. ๊ทธ๋์ subscribe์ด ๋๋๋ฉด dispose ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผํด์.
next: ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ ๋ฌํด์ค์.
error: ์๋ฌ๋ฅผ ์ ๋ฌํด์ค์.
completed: ๋ชจ๋ stream์ด ์๋ฃ๊ฐ ๋๋ฉด complete์ด ๋์.
๊ทธ๋์ stream์ error์ผ ๋, ๊ทธ๋ฆฌ๊ณ completed ์ผ ๋ ์ข ๋ฃ๊ฐ ๋์.
just์ ๊ฒฝ์ฐ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๋๊ฒจ์ฃผ๊ธฐ ๋๋ฌธ์ next๊ฐ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ ๊ทธ๋๋ก ์ ๋ฌํ์ง๋ง, from์ ๊ฒฝ์ฐ๋ ์ด๋จ๊น์?
Observable.from(["test", "array", 1, "์ ๋๋ค."]) .subscribe { event in switch event { case .next(let str): break case .error(let err): break case .completed: break } } .disposed(by: self.disposeBag)
์์ ๊ฒฝ์ฐ์๋ 4๋ฒ ๋ฐ์ดํฐ๊ฐ ๋ถ๋ฆฌ๊ธฐ ๋๋ฌธ์ next ์ญ์ 4๋ฒ ๋ถ๋ฆฌ๊ฒ ๋ ๊ฑฐ์์!
๊ทธ๋ผ ์๋์ ๊ฒฝ์ฐ ์ด๋ค ๊ฒฐ๊ณผ๋ฌผ์ด ๋์ฌ์ง ์์ํด๋ณผ๊ฒ์.
Observable.from(["test", "array", 1, "์ ๋๋ค."]) .subscribe { event in switch event { case .next(let str): print("next: \(str)") break case .error(let err): print("next: \(err.localizedDescription)") break case .completed: print("completed") break } } .disposed(by: self.disposeBag)
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฌผ์ ์๋์ ๊ฐ์์
/** next: test next: arrray next: 1 next: ์ ๋๋ค. completed */
์ฌ๊ธฐ์ ํฌ์ธํธ๋ completed๊ฐ ์๋ค๋ ์ ์ด์์. event์์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ next๋ก ๋์ด์๋ค๊ณ ํ๋๋ผ๋ stream์ด ์ข ๋ฃ๊ฐ๋๋ฉด ๋ฌด์กฐ๊ฑด .completed์ case๋ก ๋ค์ด์ค๋ ๊ฒ์ด์ฃ .
์ด๋ฒ์ ์๋ฌ๋ฅผ ์ผ์ผ์ผ ๋ณผ๊ฒ์.
Observable.from(["test", "array", 1, "์ ๋๋ค."]) .single() .subscribe { event in switch event { case .next(let str): print("next: \(str)") break case .error(let err): print("next: \(err.localizedDescription)") break case .completed: print("completed") break } } .disposed(by: self.disposeBag)
single์ ๊ฒฝ์ฐ 1๊ฐ์ ๊ฐ๋ง ๋ค์ด์ค๊ณ complete bar๊ฐ ์์์ฃ ? single์ธ๋ฐ ์ฌ๋ฌ ๊ฐ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํด์. ๊ทธ๋์ ์์ ๊ฒฝ์ฐ์๋ ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฑฐ์์.
/** next: test error: The operation ๋ธ๋ผ๋ธ๋ผ (์๋ฌ ๋ฉ์ธ์ง) */
์ฌ๊ธฐ์๋ ์ค์ํ ๊ฑด stream์ด๊ธฐ ๋๋ฌธ์ error๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ฒซ๋ฒ์งธ stream์ ๋์์ ํ๋ค๋ ๊ฒ์ด์ฃ . ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋จ์ํ ์๋ฌ๋ง ๋ก๊น ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ Rx์์๋ ์๋ฌ๊ฐ ๋์ค๋ ์์ ์ด์ ๊น์ง ์์ ์ ์ ์์ ์ผ๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ด์์!
๊ทธ๋ผ ์์ ์ํฉ ๋๋ฌธ์ ์๊ธฐ๊ธฐ ์ฌ์ด ๋ฌธ์ ๋ ์ด๋ค ๊ฒฝ์ฐ์ผ๊น์?
// Progress on Observable.from(["test", "array", 1, "์ ๋๋ค."]) .single() .subscribe { event in switch event { case .next(let str): print("next: \(str)") break case .error(let err): print("next: \(err.localizedDescription)") break case .completed: // Progress off print("completed") break } } .disposed(by: self.disposeBag)
์์ ๊ฒฝ์ฐ error๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด Progress๊ฐ ์ ๋ off ๋์ง ์์์. stream์ด ๊ณ์ next๋ง ์งํ๋ ๊ฒฝ์ฐ ๋ง์ง๋ง์ stream์ ์ข ๋ฃ๊ฐ ์์ด completed๊ฐ ๋์ํ์ง๋ง error๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ ์ฆ์ stream์ด ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ complete bar ํ์๊น์ง ๋์์ค์ง ์์ .completed๊ฐ ๋์ํ ์ผ์ด ์๊ฒ ๋์.
์ด๋ฒ์ subscribe onNext๋ฅผ ์์๋ณผ๊ฒ์!
onNext๋ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ตฌํ๋์ :]
Observable.from(["test", "array", 1, "์ ๋๋ค."]) .single() .subscribe(onNext: ~~, onError: ~~, onCompleted: ~~, onDisposed: ~~)
onNext๊ฐ ์๋ ๋จ์ on์ผ๋ก ๊ตฌํ์ด ๋์์ ๋์๋ switch์ ๋น ์ง๋ ์กฐ๊ฑด์ด ์์ผ๋ฉด ์๋ฌ์ด์. case๊ฐ 3๊ฐ์ด๋๊น ๋ฌด์กฐ๊ฑด switch์ 3๊ฐ์ง ๊ฒฝ์ฐ ๋ชจ๋๊ฐ ๊ตฌํ ๋์ด์ผํ์ฃ .
๊ทธ๋ฐ๋ฐ ์ด๊ฒ ๋ถํ์ํ๊ฒ ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ๊ท์ฐฎ์ ๋๊ฐ ์์ฃ ? ๊ทธ๋์
Next์ผ ๋๋ง ์์ ํ ๊ฑฐ์ผ
๋ผ๋ ์ํฉ์ด ํ์ํ ๋๊ฐ ์์ด์. ๋๋จธ์ง๋ ํนํ optional์ด๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ์์ฑํด์ค ํ์๊ฐ ์์ฃ ! ๊ทธ๋์ ์๋์ ๊ฐ์ด ์์ฑํ ์ ์์ด์.
Observable.from(["test", "array", 1, "์ ๋๋ค."]) .single() .subscribe(onNext: { event in print(event) } ).disposed(by: self.disposeBag)
์ด์ onError๋ onCompleted, onDisposed๋ ์์ฑํด๋ณผ๊ฒ์!
Observable.from(["test", "array", 1, "์ ๋๋ค."]) .single() .subscribe(onNext: { event in print(event) }, onError: { err in print(err.localizedDescription) }, onCompleted: { print("onCompleted") }, onDisposed: { print("disposed") } ).disposed(by: self.disposeBag)
์ฌ๊ธฐ์ ์ญ์ error๊ฐ ๋ฐ์ํ ํ ๋ฐ์, on์์ ํ๋ ์์์ ๋ค๋ฅธ ๊ฒ์ "disposed"๊ฐ ์ถ๋ ฅ๋๋ค๋ ์ ์ด์์. onDisposed๋ ๋ง ๊ทธ๋๋ก dispose๋ ๋์ด๊ณ , dispose๋ Error๋ Complete ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋์ํ๊ธฐ ๋๋ฌธ์ด์์!
๊ทธ๋ฐ๋ฐ ์์ ์ฝ๋๋ ์กฐ๊ธ ์ง์ ๋ถํด์. ๊ทธ๋์ ์๋์ ๊ฐ์ด ์ข ๋ ๊ฐ๋ ์ฑ ์ข๊ฒ ๋ณ๊ฒฝํ ์ ์์ด์.
private func output(_ event: Any) { print(event) } func exampleFrom() { Observable.from(["test", "array", 1, "์ ๋๋ค."]) .single() .subscribe(onNext: output) .disposed(by: self.disposeBag) }
ํจ์ฌ ๊ฐ๋จํ๊ณ ๊น๋ํด์ก์ด์. onNext ๋ค์ ๋ค์ด๊ฐ ํด๋ก์ ๋ input parameter๊ฐ event, ์์ ๊ฒฐ๊ณผ๋ฌผ์ด Void๋ก print์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ์กฐ๊ฑด์ ๋ง์ถ ๋ฉ์๋๋ก ๋ถ๋ฆฌ ๊ฐ๋ฅํด์.
4ํธ์ ์ฌ๊ธฐ๊น์ง ์ ๋๋ค! 5ํธ์์๋ observeOn์ฒ๋ผ Main Thread๊ฐ ์๋ Concurrency Thread์์ ์์ ํ๋ ๋ฒ์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณผ๊ฒ์! :]
'iOS ์ฑ๊ฐ๋ฐ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Custom UIColor ๋ง๋ค๊ธฐ (0) | 2022.01.02 |
---|---|
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_05 (0) | 2021.10.24 |
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_03 (0) | 2021.10.17 |
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_02 (0) | 2021.10.17 |
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_01 (0) | 2021.10.17 |
- Total
- Today
- Yesterday
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- API#lazy#
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ํธ์ฝ๋#dp#BOJ#Python
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- django
- Triangle#Sorting#Codility#Python
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- django#slicing
- filter#isalnum#lower
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
- ์์ด์ฌ์ดํด#BOJ#Python
- Distinct#Codility#Python
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
- Swift#Tuples#Range
- N์ผ๋ก ํํ#DP#Programmers#Python
- Brackets#Stacks and Queues#Codility#Python
- PassingCars#Codility#Python
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |