ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ฏ RxSwift ์ดํดํ๊ธฐ_01
๐ ์ด ๊ธ์ RxSwift์ ๋ํ ์์ฒญ๋ ์ดํด๋ ๋ณธ์ง์ ํ์ ํ๋ค๊ธฐ๋ณด๋ค ์ ๋ฌธํ๋ ์ ์ฅ์์ ์์ฑํ๋ ๊ธ์ด์์! ๊ณฐํ๊น๋์ ๊ฐ์(ํ๋จ์ ๋งํฌ) ๋ฅผ ๋ค์ผ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ, ์๊ฐ๋ค์ ์์ฑํ ์์ ์ด์์. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์ถ๊ฐํ๋ฉด ์ข์ ๋ถ๋ถ์ ๋ํ ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค :]
์ ์์์ ๋ํ ํ์์ ๋งํฌ๊ฐ ์์ง๋ง ํน์๋ ๋ฌธ์ ๊ฐ ๋ ๊ฒฝ์ฐ ๋ฐ๋ก ์ญ์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
Git Contributors์ ๋ฐ๊ฐ์ด ์ด๋ฆ์ด..
๐ง๐ปโ๐ป What - RxSwift๋?
RxSwift๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ์ฐ์ Rx๊ฐ ๋ฌด์์ธ์ง ์ดํดํ ํ์๊ฐ ์์ด์. ReactiveX ๊ณต์ ํํ์ด์ง๋ฅผ ๋ค์ด๊ฐ๋ณด๋ฉด ์ฒซ ํ๋ฉด์ ์๋์ ๊ฐ์ ์ค๋ช ์ด ๋์์!
An API for asynchronous programming with observable streams
ํด์ํด๋ณด๋ฉด, Rx๋ observable streams๋ฅผ ํ์ฉํ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํ API ์์. RxSwift๋ ๋น์ฐํ ์ด Rx๋ฅผ ํ์ฉํ๋ Swift์ด๊ฒ ์ฃ ? ๊ทธ๋ผ ์ด์ ๋ถํฐ ์ ํ ๋ฌธ์ฅ์ ์ดํดํ๊ธฐ ์ํ ๊ธ์ ์์ํฉ๋๋ค!
โ๏ธ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด๋?
๊ธ์ ๋ชฉ์ ์ด ๋น๋๊ธฐ ํ๋ก๊ทธ๋จ์ ์ค๋ช ํ๋ ๊ฒ์ ์๋๋ค๋ณด๋ ์์ธํ ์ค๋ช ์ ์ด๋ ค์ธ ๊ฒ ๊ฐ์ง๋ง ๋ฆฌ๋ง์ธ๋ ์์ค์ผ๋ก ์ ์ด๋ณด๋ ค๊ณ ํด์. ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐ๋ ๊ฐ๋ ์ด์์! ๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฒ์ ํ๋์ ์์ ๋ง ํ๋ ๊ฐ๋ ์ด๋๊น, ๋น๋๊ธฐ๋ ์ด๋ค ํ ์์ ์ด ์งํ๋ ๋ ๋ค๋ฅธ ์์ ๋ ๋์์ ํ ์ ์๋ ๊ฐ๋ ์ด๊ฒ ์ฃ ?
์๋ฅผ ๋ค๋ฉด, ์ซ์๋ฅผ ์ฌ๋ ค์ฃผ๋ ์์ ์ด ์งํ๋๊ณ ์๋ ์ํฉ์์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด ๋ฐ์์ผ ํ๋ ์ํฉ์ด์์. ๋๊ธฐ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ๋ฉด ์ซ์๋ฅผ ์ฌ๋ ค์ฃผ๋ค๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ ์์ ์ ํ๊ฒ ๋๋ฉด ์ซ์๋ฅผ ์ฌ๋ ค์ฃผ๋ ์์ ์ ๋ฉ์ถ๊ฒ ๋์. ์๋๋ ๊ทธ ๋๊ธฐ์ ์์ ์ ์์์์. ๋ฐ๋๋ก ๋น๋๊ธฐ์ ์ด๋ผ๋ฉด ์ด๋ฏธ์ง๋ฅผ ๋ค์ด ๋ฐ๋ ์ฌ๋ถ์ ์๊ด์์ด ์ซ์๋ ๊ณ์ ์ฌ๋ผ๊ฐ ๊ฑฐ์์.
์ด๋ฐ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋๊ตฌ๋ค๋ก PromiseKit, Bolts๊ฐ ์์ด์. PromiseKit์ ๊ฐ์ฅ ์ ๋ช ํ๋ฐ ์ด Promise๋ผ๋ ๋ฐฉ์์ด JavaScript์์ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํด์! ์ด ๋ถ๋ถ์ ๋ํ ๊ธ์ ์ถํ์ ์ธ์ ๊ฐ.. ์จ๋ณผ๊ฒ์!
๐ Why - RxSwift๋ ์ ์ฌ์ฉํ๋์?
์์ PromiseKit, Bolts์ญ์ ๋ง์ฐฌ๊ฐ์ง๋ผ๊ณ ์๊ฐํด์. ๊ฒฐ๊ตญ "๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ"์ ์ด๋ป๊ฒํ๋ฉด ๋ ์ฝ๊ฒ ํ ์ ์์๊น ๊ฐ ํฌ์ธํธ์ฌ์ Asyncํ๊ฒ ์ฒ๋ฆฌ๋์ผํ๋ ์์ ์ด ์์ ๋ ์กฐ๊ธ ๋ ๊ฐ๊ฒฐํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ๋ก์ RxSwift๋ฅผ ์ฌ์ฉํด์.
๊ทธ๋ผ ์ PromiseKit์ด๋ Bolts๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ตณ์ด RxSwift๋ฅผ ์ฌ์ฉํ๋?๋ผ๋ ์๋ฌธ์ด ์์ฐ์ค๋ฝ๊ฒ ์๊ธธ๊ฑฐ์์
(๋๋ง..?). RxSwift์๋ ๋ฌด์ธ๊ฐ ํ ๊ฐ๊ฐ ๋ ์๋๋ฐ ๊ทธ๊ฒ Operators์์. ์์ธํ ์ค๋ช ์ ์ดํ ์ด์ด์ ธ์! ๋ค๋ง, ์ฌ๊ธฐ์๋ "RxSwift๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๊ฒฐํ๋ฅผ ์ํด์, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค์์๋ ๋ค๋ฅธ Kit๊ณผ ๋ค๋ฅธ ๊ธฐ๋ฅ์ด ์๋ค" ์ ๋๋ก ์ ๋ฆฌํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
๐ How - RxSwift ์ฒ์ ์ฌ์ฉํด๋ณด๊ธฐ
๋ชจ๋ ์์ ์ฝ๋๋ ๊ณฐํ๊น๋์ github์ด ์ถ์ฒ์์!
RxSwift์ ์ฝ๋๋ฅผ ๋จผ์ ์ดํด๋ณผ๊ฒ์
@IBAction func onLoadImage(_ sender: Any) { imageView.image = nil _ = rxswiftLoadImage(from: LARGER_IMAGE_URL) .observeOn(MainScheduler.instance) .subscribe({ result in switch result { case let .next(image): self.imageView.image = image case let .error(err): print(err.localizedDescription) case .completed: break } }) } // MARK: - RxSwift func rxswiftLoadImage(from imageUrl: String) -> Observable<UIImage?> { return Observable.create { seal in asyncLoadImage(from: imageUrl) { image in seal.onNext(image) seal.onCompleted() } return Disposables.create() } }
์์ ์ฝ๋๋ ์๊น ์์์์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด ๋ฐ๊ธฐ ์ํด "๋๊ธฐ" ๋ฒํผ์ ํด๋ฆญํ๋ ๊ฒฝ์ฐ์ ๋ก์ง์ด์์. ์ฌ๊ธฐ์ rxswiftLoadImage ๋ฉ์๋๋ Observable์ ๋ฐํํด์. ๊ทธ๋ฆฌ๊ณ onLoadImage์์ ์ด observable์ subscribeํ๋๋ฐ ์ด ๊ฒฝ์ฐ disposable์ด ๋ฐํ๋์. ์ฌ๊ธฐ์ disposable์ด๋ ์ฝ๊ฒ ๋ฒ๋ฆด ์ ์๋ค๋ ๋ป์ด์์! (TMI: dis(off) + pos)
๊ทธ๋ผ ์ด ๋ค์ด๋ก๋ ์์ ์ ์ทจ์ํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณผ๊ฒ์! ์ด๋ฆ์ onCancel๋ก ํ ๊ฒ์.
์ด onCancel์์ ์ทจ์๋ฅผ ํ๋ ค๋ฉด ๋ญ ์ทจ์ํ๋ ค๋์ง ์์์ผ๊ฒ ์ฃ ? ๊ทธ๋์ ์ด ViewController๊ฐ ์์ disposable์ ์๊ฒ ํ๊ธฐ ์ํด ํ๋กํผํฐ๋ฅผ ์์ฑํด์ฃผ๊ณ ๊ทธ ํ๋กํผํฐ์ disposable ๊ฒฐ๊ณผ๋ฌผ์ ๋ฃ๊ฒ ํ ๊ฑฐ์์.
var disposable: Disposable? @IBAction func onLoadImage(_ sender: Any) { imageView.image = nil self.disposable = rxswiftLoadImage(from: LARGER_IMAGE_URL) ... @IBAction func onCancel(_ sender: Any) { self.disposable?.dispose() }
onLoadImage์์ ์๊ธด disposable์ ํ๋กํผํฐ๋ก VC๊ฐ ๊ฐ๊ณ , onCancel์์ VC๊ฐ disposable์ ๊ฐ์ง๊ณ ์๋ค๋ฉด(๋ฒ๋ฆด๊ฒ ์๋ค๋ฉด) ๋ฒ๋ฆฌ๋ ๊ตฌ์กฐ๋ก ์์ฑํ ์ ์์ด์. ๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด ์ ์๋ํด์.
์ด๋ฒ์ dispose bag์ด๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํด๋ณผ๊ฒ์. ๋ฐ๋ก ์์์ ํ๋ ์์ ์ฒ๋ผ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฒ๋ฆฌ๊ณ ์ถ์๋ฐ Disposable ํ ๊ฐ์ฉ ํ๋กํผํฐ์ ์ ์ฅํด์ ๋ฒ๋ฆฌ๋๊ฒ ์๋๋ผ Disposable์ ๋ด์๋๋ ๊ฐ๋ฐฉ์ ๊ฐ๋ ์ด์์! ์ ์ ํ ๋ค์ด๋ฐ์ ์์ ๊ฐ๋ค์ :]
์์ ์ฝ๋๋ฅผ ์ด์ง ๋ฐ๊ฟ๋ณผ๊ฒ์. ์ฐ์ ํ๋กํผํฐ disposable์ disposeBag์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๊ณ , disposable์ ๋ง๋ค ๋ ๊ฐ๋ฐฉ์ ๋ด์๋๊ฑฐ์์.
@IBAction func onLoadImage(_ sender: Any) { imageView.image = nil // ๋ณ๊ฒฝ let disposable = rxswiftLoadImage(from: LARGER_IMAGE_URL) ... }) disposeBag.insert(disposable) @IBAction func onCancel(_ sender: Any) { self.disposable?.dispose() // ์๋ฌ ๋ฐ์ }
์ด๋ ๊ฒ ํ๊ณ ๋์ด๋ฉด ํธํ๊ฒ ์ง๋ง.. disposable๊ณผ ๋ค๋ฅด๊ฒ dispose bag์ dispose()๋ผ๋ ๋ฉ์๋๊ฐ ์์ด์. ๊ทธ๋์ dispose bag์ ๋น์์ฃผ๋ ๊ฑด ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ํด์ผ๋์.
@IBAction func onCancel(_ sender: Any) { self.disposeBag = DisposeBag() }
์ฌ๊ธฐ์ ํ๋จ๊ณ ๋ ๋์๊ฐ์, disposable์ ๋ด์ ๋ ์์์ ๋ด์์ insertํ๋๊ฒ ์๋๋ผ ๋ฐ๋ก disposed๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
@IBAction func onLoadImage(_ sender: Any) { imageView.image = nil rxswiftLoadImage(from: LARGER_IMAGE_URL) .observeOn(MainScheduler.instance) .subscribe({ result in ... } }).disposed(by: self.disposeBag) }
๊ฐ์ธ์ ์ผ๋ก๋ ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ๋ ์ง๊ด์ ์ด์ง๋ง ์๋ ๋ฐฉ๋ฒ์ด ๋ ๊ฐ๊ฒฐํ ๊ฒ ๊ฐ์์.
2ํธ - https://jayb-log.tistory.com/276 ์์๋ Operators ์ด์ผ๊ธฐ๋ก ๋์ด๊ฐ๋ณผ๊ฒ์!
'iOS ์ฑ๊ฐ๋ฐ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_03 (0) | 2021.10.17 |
---|---|
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_02 (0) | 2021.10.17 |
[iOS] - Texture ์ค์นํ๊ธฐ (0) | 2021.08.20 |
[iOS] - View Controller (0) | 2021.06.08 |
[iOS] - ์ ๋ ํ ์คํธ(Unit Tests) (0) | 2021.05.12 |
- Total
- Today
- Yesterday
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- NumberofDiscIntersections#Codility#Sort#Python
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- PassingCars#Codility#Python
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ์์ด์ฌ์ดํด#BOJ#Python
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
- Distinct#Codility#Python
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- ์ํธ์ฝ๋#dp#BOJ#Python
- N์ผ๋ก ํํ#DP#Programmers#Python
- filter#isalnum#lower
- django
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- Brackets#Stacks and Queues#Codility#Python
- Swift#Tuples#Range
- Triangle#Sorting#Codility#Python
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
- django#slicing
- API#lazy#
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#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 |