ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ฏ RxSwift ์ดํดํ๊ธฐ_05
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 ์ดํดํ๊ธฐ_04 - https://jayb-log.tistory.com/278
๐ ์ด ๊ธ์ RxSwift์ ๋ํ ์์ฒญ๋ ์ดํด๋ ๋ณธ์ง์ ํ์ ํ๋ค๊ธฐ๋ณด๋ค ์ ๋ฌธํ๋ ์ ์ฅ์์ ์์ฑํ๋ ๊ธ์ด์์! ๊ณฐํ๊น๋์ ๊ฐ์(ํ๋จ์ ๋งํฌ) ๋ฅผ ๋ค์ผ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ, ์๊ฐ๋ค์ ์์ฑํ ์์ ์ด์์. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์ถ๊ฐํ๋ฉด ์ข์ ๋ถ๋ถ์ ๋ํ ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค :]
์ด ๊ธ์์๋ Main Thread, Concurrency Thread์์ ์์ ํ๊ธฐ ์ํ ๊ธฐ๋ฅ๋ค์ ๋ํด ์ด์ผ๊ธฐํด๋ณผ๊ฒ์ โบ๏ธ
์ด ๊ธ์์ ์ฐ๋ ๋์ ๋ํ ์ค๋ช ์ ํ์ง๋ ์์๊ฒ์! ํน์ ๋ ์ฐ๋ ๋์ ์ฐจ์ด์ ๋ํด ์ค๋ช ํ๊ธฐ ์ด๋ ค์ฐ์๋ค๋ฉด ์ฐ๋ ๋์ ๋ํ ํ์ต์ ์ ํํ์๋ ๊ฑธ ์ถ์ฒ๋๋ ค์ :]
๐ง๐ปโ๐ป observeOn
์์ ์ดํด๋ดค์๋ ์์ ๋ฅผ ๋ค์ ํ ๋ฒ ๋ณผ๊ฒ์.
@IBAction func exMap3() { Observable.just("800x600") .map { $0.replacingOccurrences(of: "x", with: "/") } .map { "https://picsum.photos/\($0)/?random" } .map { URL(string: $0) } .filter { $0 != nil } .map { $0! } .map { try Data(contentsOf: $0) } .map { UIImage(data: $0) } .subscribe(onNext: { image in self.imageView.image = image }) .disposed(by: disposeBag) }
์์ ์ฝ๋๋ Main Thread์์ ๋์ํ๊ฒ๋์. ๋ชจ๋ ์์ ๋ค์ด Main์์ ์์ ๋๊ธฐ ๋๋ฌธ์ Concurrency Thread๋ก ์ฎ๊ฒจ์ค์ผ ํด์. ์ด๋ ๊ฒ ์ฐ๋ ๋๋ฅผ ์ด๋์ํฌ ๋ observeOn์ ์ฌ์ฉํด์.
@IBAction func exMap3() { Observable.just("800x600") .observeOn(ConcurrentDispatchQueueScheduler(qos: .default)) // ์ฐ๋ ๋ ์ด๋ .map { $0.replacingOccurrences(of: "x", with: "/") } .map { "https://picsum.photos/\($0)/?random" } .map { URL(string: $0) } .filter { $0 != nil } .map { $0! } .map { try Data(contentsOf: $0) } .map { UIImage(data: $0) } .subscribe(onNext: { image in self.imageView.image = image }) .disposed(by: disposeBag) }
ํ์ง๋ง ์ ์ฒ๋ผ๋ง ์์ฑํ๋ฉด ์ด๋ฏธ์ง๋ฅผ Settingํ๋ ์์ ์ Main Thread์์ ์ด๋ค์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํด์.
@IBAction func exMap3() { Observable.just("800x600") .observeOn(ConcurrentDispatchQueueScheduler(qos: .default)) // ์ฐ๋ ๋ ์ด๋ .map { $0.replacingOccurrences(of: "x", with: "/") } .map { "https://picsum.photos/\($0)/?random" } .map { URL(string: $0) } .filter { $0 != nil } .map { $0! } .map { try Data(contentsOf: $0) } .map { UIImage(data: $0) } .observeOn() .observeOn(MainScheduler.instance) // ์ด๋ฏธ์ง ์ธํ ์ง์ ์ฐ๋ ๋ ์ฌ์ด๋ .subscribe(onNext: { image in self.imageView.image = image }) .disposed(by: disposeBag) }
observeOn์ด ๊ฑธ๋ ค์๋ ๋ค์ ์ค๋ถํฐ์ Stream๋ค์ ๋ชจ๋ observeOn์ ๊ฑธ๋ ค์๋ ์ฐ๋ ๋์์ ๋์ํ๊ฒ ๋์. ์ฆ, observeOn์ ์์น๋ฅผ ์กฐ์ ํ์ฌ ํน์ ์์ ๋ง concurrentํ๊ฒ ์งํํ ์ ์๊ฒ ๋์ฃ . ๋ง์ฝ ์์ ์์ ์ ์กฐ๊ธ ๋ณ๊ฒฝํด์
@IBAction func exMap3() { Observable.just("800x600") .map { $0.replacingOccurrences(of: "x", with: "/") } .map { "https://picsum.photos/\($0)/?random" } .map { URL(string: $0) } .filter { $0 != nil } .map { $0! } .map { try Data(contentsOf: $0) } .observeOn(ConcurrentDispatchQueueScheduler(qos: .default)) // ์ฐ๋ ๋ ์ด๋ .map { UIImage(data: $0) } .observeOn() .observeOn(MainScheduler.instance) // ์ด๋ฏธ์ง ์ธํ ์ง์ ์ฐ๋ ๋ ์ฌ์ด๋ .subscribe(onNext: { image in self.imageView.image = image }) .disposed(by: disposeBag) }
์ด๋ ๊ฒ ๋ฐฐ์นํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋์ ์ฑ์ด ๋ฉ์ถ๊ฒ ๋ ๊ฑฐ์์. Data๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ Main Thread์์ ์งํํ ๊ฒฝ์ฐ ๋๋ ์ด๊ฐ ๋๊ปด์ง๊ฒ ๋๋ ๊ฒ์ด์ฃ .
๐ง๐ปโ๐ป subscribeOn
observeOn์ ๊ฒฝ์ฐ observeOn์ด ์ ์๋ ๊ทธ ๋ค์ ์ค๋ถํฐ ์ํฅ์ ๋ผ์น๊ฒ ๋๋ค๊ณ ํ์์ฃ ! subscribeOn์ ์ด์ ๋ค๋ฅด๊ฒ ์ด๋ฆ ๊ทธ๋๋ก
subscribe๊ฐ ๋๋ ์์
๋ถํฐ๋ฅผ ์๋ฏธํด์.
@IBAction func exMap3() { Observable.just("800x600") .map { $0.replacingOccurrences(of: "x", with: "/") } .map { "https://picsum.photos/\($0)/?random" } .map { URL(string: $0) } .filter { $0 != nil } .map { $0! } .map { try Data(contentsOf: $0) } .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .default)) // ์ฐ๋ ๋ ์ด๋ .map { UIImage(data: $0) } .observeOn() .observeOn(MainScheduler.instance) // ์ด๋ฏธ์ง ์ธํ ์ง์ ์ฐ๋ ๋ ์ฌ์ด๋ .subscribe(onNext: { image in self.imageView.image = image }) .disposed(by: disposeBag) }
์ฆ, subscribe๊ฐ ์์๋๋ ์์ ๋ถํฐ Concurrentํ๊ฒ ์์ ์ ์งํํ ๊ฑฐ์ผ! ๋ผ๋ ๋ป์ด ๋ฉ๋๋ค. ๋น์ฐํ subscribeOn์ ์์น๋ ์ค์ํ์ง ์๊ฒ ์ฃ ? ์ด๋์ ์์นํ๋๋ผ๋ ์์ ์์ ์ด subscribe๊ฐ ๋๋๊น์ :]
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, subscribe ์ฝ๋๊ฐ ์คํ ๋ ๋ Observable๋ถํฐ ์ญ Stream์ด ์งํ๋๊ฒ ๋ฉ๋๋ค.
Scheduler๋ ์ด๊ฒ๋ง ์์๋ ์ถฉ๋ถํด์! OperationQueue๋ GCD๋ฅผ ์ปค์คํ ํด์ ์ฌ์ฉํ ๊ฒ ์๋๋ผ๋ฉด
Main Thread -> MainScheduler.instance
Concurrency Thread -> ConcurrentDispatchQueueScheduler(qos: .default)
๋ฅผ ์ ํ์ฉํ๋๋ก ํด์!
๐ Side Effect
์์์ฝ๋๋ฅผ ๋ ๋ค์ ๋ณผ๊ฒ์!
@IBAction func exMap3() { Observable.just("800x600") .map { $0.replacingOccurrences(of: "x", with: "/") } .map { "https://picsum.photos/\($0)/?random" } .map { URL(string: $0) } .filter { $0 != nil } .map { $0! } .map { try Data(contentsOf: $0) } .map { UIImage(data: $0) } .subscribe(onNext: { image in self.imageView.image = image }) .disposed(by: disposeBag) }
์ฌ๊ธฐ์ map ๋ฑ์ stream์ ๋ฉ์๋ ๋ด๋ถ์ ์ผ๋ก๋ง ๋์ํ๊ธฐ ๋๋ฌธ์ ์ฃผ๋ณ์ ์ํฅ์ ๋ผ์น์ง ์์ง๋ง subscribe์ ๊ฒฝ์ฐ ๋ฉ์๋ ์ธ๋ถ์ ํ๋กํผํฐ์ ์ํฅ์ ๋ฏธ์น๊ณ ์์ด์.
image๋ฅผ ๋ฐ์์ ํ๋กํผํฐ์ ํ ๋นํ๋ ๊ตฌ์กฐ๋๊น์.
์ฆ, ๋ฉ์๋ ์ธ๋ถ์ ์ํฅ์ ๋ฏธ์น๊ณ ์๋ค๊ณ ํ ์ ์๊ณ ์ด๋ฐ ๊ฒ์
side effect๊ฐ ์๋ค
๊ณ ํด์.์ด๋ ๊ฒ side effect๋ฅผ ํ์ฉํด์ฃผ๋ ๊ณณ์ 2๊ตฐ๋ฐ๊ฐ ์์ด์.
๋ฐฉ๊ธ ๋ณธ subscribe, ๊ทธ๋ฆฌ๊ณ do๊ฐ ์์ด์.
do๋ subscribe์ ๋ค๋ฅด๊ฒ stream์ด ์ง๋๊ฐ๋ ๋์ ๊ทธ๋ฅ ์์ ์ ํ ๋ฒ ํด์ฃผ๋ ๊ฑฐ์์.
๊ฒฐ๋ก ์ ์ผ๋ก
์ธ๋ถ์ ์ํฅ์ ๋ผ์น๋ side effect๋ฅผ ์ฒ๋ฆฌํด์ผํ๋ค
->do๋ subscribe์์ ํด์ฃผ๋ฉด ๋์!
- ์ด๋ฒ ๊ธ์ ์ฌ๊ธฐ์ ๋ง๋ฌด๋ฆฌ ํ ๊ฒ์!
'iOS ์ฑ๊ฐ๋ฐ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Kakao API ์ฌ์ฉ์ Date ํ์ ์ด iso8601์ผ ๋ iOS์์ Decoding์ด ์๋๋ ๊ฒฝ์ฐ (0) | 2022.01.03 |
---|---|
[iOS] Custom UIColor ๋ง๋ค๊ธฐ (0) | 2022.01.02 |
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_04 (0) | 2021.10.24 |
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_03 (0) | 2021.10.17 |
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_02 (0) | 2021.10.17 |
- Total
- Today
- Yesterday
- Brackets#Stacks and Queues#Codility#Python
- django#slicing
- ์ํธ์ฝ๋#dp#BOJ#Python
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- filter#isalnum#lower
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- Distinct#Codility#Python
- PassingCars#Codility#Python
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
- NumberofDiscIntersections#Codility#Sort#Python
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
- Triangle#Sorting#Codility#Python
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- N์ผ๋ก ํํ#DP#Programmers#Python
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- django
- Swift#Tuples#Range
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
- API#lazy#
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
- ์์ด์ฌ์ดํด#BOJ#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 |