-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
653b429
commit f189024
Showing
1 changed file
with
299 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,299 @@ | ||
# RxCocoa ๋ง๋ณด๊ธฐ | ||
|
||
๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ RxCocoa์ ๋ํด์ ์์๋ด ์๋ค. | ||
|
||
- **๊ธฐ๊ฐ :** 2021.05.06(๋ชฉ) ~ 2021.05.11(ํ) | ||
- **์์ฑ์ :** ๊นํํ | ||
|
||
<br> | ||
|
||
``` | ||
์ด๋ฒ์๋ RxCocoa์ ๋ํด์ ์์๋ด ์๋ค^^ | ||
RxCocoa๋ฅผ ์๊ฐํด๋ณด๋ฉด UI์ Rx๋ฅผ ์ ์ฉํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๊น ์ถ์ต๋๋ค. | ||
์ฌ์ค ์์์ ์ด์ผ๊ธฐํ ๋ด์ฉ์ ์ ํํ ์ ์๊ฐ ๋์ง๋ ๋ชปํฉ๋๋ค. | ||
๊ทธ๋ฌ๋ ์ฒ์๋ถํฐ ์ ํํ ์ด๋ก ์ด๋ ์ ์์ ์ง์คํ๋ค๊ฐ๋ ๊ณต๋ถํ ๋ง์ด ๋์ง ์์ ๊ฒ ๊ฐ์์.. | ||
์ฐ์ ์ ์ฌ์ฉํ๊ณ ๋ด ์๋ค!!!๐ | ||
์ด์ฐจํผ ๋ด๊ฐ ์ฌ์ฉํด๋ด์ผ ์ ๋ฆฌ๊ฐ ๋๋๊ฑฐ๋๊น ~~ | ||
(์๊ณค์๊ณค)๋ฐ์์ ์ด๋ก ์ ์ดํด๋ณด๊ธด ํฉ๋๋ค๐ | ||
``` | ||
|
||
<br> | ||
|
||
## ๋ค์ด๊ฐ๊ธฐ์ ์ | ||
``` | ||
ใ ใ , ์ ๊น!! ์ ๋ ์ฌ๊ธฐ์ ํ ๋ฒ์ ๋ค ์ดํด์๋๋๊ฒ ์ ์์ด๋๊น ๊ทธ๋ฅ ํธํ๊ฒ ์ดํด๋ด ์๋ค~!~!๐ถ | ||
๋ณธ๊ฒฉ์ ์ผ๋ก ๋ค์ด๊ฐ๊ธฐ์ ์ ์ฐ๋ฆฌ์ ๋ชฉํ๋ฅผ ์๊ฐํด๋ด ์๋ค. | ||
์ด ํํธ๋ฅผ ๋ค ๋ณด๊ณ ๋ ๋ค์๋ ์ด๋ค ๋ชจ์ต์ ๊ฐ์ถฐ์ผํ ์ง! ๋ง์์, ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์์ด์ผ ๊ฒ ์ฃ ..? ์ฐ๋ฆฌ RxSwift ์ ์ฉํ ๊ฑฐ ์์์! | ||
์ฐ๋ฆฌ RxCocoa ์ฌ์ฉํด์ UI ๋ณด์ฌ์ค ๊ฑฐ ์์์!!!!!! (๋ถ๋ ธ ๐ ) ๐ ๊ฑฐ์ ๋ถ์กฐ์ฅ | ||
์์งํ ๋ค ๋ณด๊ณ ๋์ ์ด๋ก ์ ๊ธฐ์ต๋ชปํด๋ ์ฝ๋ ์์ฑํด๋ณผ ์ ์๋๋ก ํฉ์๋ค ๐ | ||
๋ค ์ ์ ์ง์ ์ข ํ๊ณ ์ฒ์ฒํ ํ๋์ฉ ์ดํด๋ณด๋๋ก ํ์ ธ~~ (๋งจ๋ ์๋ก ์ด ๊ธด ์ด์ํ ์ ๋ฆฌ๋ฒ..ใ ใ ) | ||
``` | ||
|
||
<br> | ||
<br> | ||
|
||
`RxCocoa์ ๊ฐ๋ ` `control property` `bind` `trait` `drive` ๋ฑ๋ฑ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค..! | ||
|
||
## RxCocoa๋? | ||
|
||
RxCocoa๋ฅผ ์ ๋ฆฌํด์ ๋งํ๋ฉด, | ||
|
||
- ์ ํ ํ๊ฒฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๊ธฐ ์ํ ๋๊ตฌ๋ค์ ๋ชจ์๋์ Cocoa Framework๋ฅผ Rx์ ํฉ์น ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ||
- UI Control๊ณผ ๋ค๋ฅธ SDK ํด๋์ค๋ฅผ Wrappingํ ์ปค์คํ Extension set | ||
(์๋ ์ ์์ด๋ ํ๊ธ์ด๋ ์์ด์ฐ๋๊ฑฐ์ง..;;) | ||
|
||
์ด๋ ๋ค๊ณ ํฉ๋๋ค. | ||
|
||
โ) ํฐ์น์ ๊ด๋ จ๋ ๋๋ฐ์ด์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ์ฐ๋ฆฌ๋ ์ฝ์ฝ์ ํฐ์น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ์. ๋ณดํต iOS ๊ฐ๋ฐํ ๋๋ ์ฝ์ฝ์ ํฐ์น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฑ ๋ณด๋ค ์์ฃผ ๋ง๋๋ UIKit์ด๋ Foundation ํ๋ ์์ํฌ๊ฐ ์ด ์์ ํฌํจ๋์ด ์์ฃ . | ||
|
||
๊ทธ๋ฌ๋๊น Rx๊ธฐ๋ฅ์ ์ฝ์ฝ์ ํ๋ ์์ํฌ์ ํฉ์น๊ฒ์ RxCocoa๋ผ๊ณ ํ๋ ๊ฑฐ๊ณ , UI Controls ๊ด๋ จํด์ ๊ธฐ๋ฅ์ ์ข ๋ ํ์ฅํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ ๊น์..? | ||
|
||
์์์ ๋ฌด์จ ์ต์คํ ์ ์ธํธ๋ค, ์ฝ์ฝ์ ํ๋ ์์ํฌ๋ฅผ ํฉ์น๊ฑฐ๋ค... ๊ต์ฅํ ์ถ์์ ์ผ๋ก ์ค๋ช ์ด ๋์๋๋ฐ, RxCocoa๊ฐ ๋ญ๋๊ณ ์ ๊ฒ ๋ฌผ์ด๋ณธ๋ค๋ฉด,, ๋ฐ์ ๊ฐ๋ ์ ์๊ฐ ๊ฐ์ฅ ์๋ฟ์ ๊ฒ ๊ฐ์์ ๋ค์๊ณผ ๊ฐ์ด ๋งํ ๊ฑฐ ๊ฐ์์! | ||
|
||
> RxSwift๋ ์ผ๋ฐ์ ์ธ Rx API๋ผ์, Cocoa๋ ํน์ UIKit ํด๋์ค์ ๋ํ ์๋ฌด๋ฐ ์ ๋ณด๊ฐ ์๋ค. RxCocoa๋ RxSwift์ ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์จ, **UIKit๊ณผ Cocoa ํ๋ ์์ํฌ ๊ธฐ๋ฐ ๊ฐ๋ฐ์ ์ง์ํ๋ ๋ชจ๋ ํด๋์ค๋ฅผ ๋ณด์ **ํ๋ ์น๊ตฌ์ด๋ค. | ||
**[์ธ์ฉ ์ถ์ฒ]**: [https://jinshine.github.io/2019/01/01/RxSwift/1.RxSwift๋/](https://jinshine.github.io/2019/01/01/RxSwift/1.RxSwift%EB%9E%80/) | ||
|
||
**โญ๏ธ ํ ์ค ์ ๋ฆฌ** | ||
|
||
<u>UIKit ๊ด๋ จํด์ ๊ฐ๋ฐํ ๋๋ Rx๊ธฐ๋ฅ์ ์ด์ฉํ๊ณ ์ถ์ด? ๊ทธ๋ผ RxCocoa ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋๊ฑฐ์ผ ~ ๐ โ</u> | ||
|
||
--- | ||
|
||
## RxCocoa ์ข ๋ ์์๋ณด๊ธฐ | ||
|
||
(**subscribe), bind, drive๋ฅผ ์ด 3๊ฐ์ง๋ฅผ ๊ธฐ์ตํด๋ด ์๋ค.** | ||
|
||
`binder` `driver` ์ ๋ํด์ ์ดํดํ๋ค๋ฉด ์ฌ์ค์ ์ค๋ ๋ชฉ์ ์ ๊ฑฐ์ ์ด๋ฃฌ๊ฑฐ๋ ๋ค๋ฆ์์!! | ||
|
||
## Subscribe | ||
|
||
๊ตฌ๋ ํ๋ ๋์(์ต์ ๋ฒ๋ธ)์ ๋ณํจ์ ๋ฐ๋ผ์ ๋ฐฉ์ถํ๋ Next ๊ฐ๊ณผ Error ๊ฐ, Complete ๊ฐ ๋ฐ์์์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฐ๋ ์ด์์ฃ ! | ||
|
||
RxSwift์์๋ ๊ตฌ๋ ์๋ฅผ ์ถ๊ฐํ ๋ subscribe ๋ฉ์๋๋ฅผ ์ด์ฉํ๋๋ฐ, RxCocoa๋ ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. | ||
|
||
๋ฐ์์ ์ดํด๋ณผ ๋ฐ์ธ๋ฉ(Binding)๊ฐ๋ ์ธ๋ฐ subscribe ๋ฉ์๋ ๋์ ์ bind ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํด๋ณผ๊ฑฐ์์. | ||
|
||
## Binding | ||
|
||
`ํ๋์ ์ฐ๊ฒฐ ์์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ข์ ๋ฏ ํ๋ค์~` | ||
|
||
`๋ฐ์ดํฐ๋ฅผ UI์ ํ์ํ๊ธฐ ์ํ ๋ฐฉ-๋ฒ` | ||
|
||
๋ฐ์ธ๋ฉ์๋ ๋ฐ์ดํฐ ์์ฐ์์ ๋ฐ์ดํฐ ์๋น์๊ฐ ์๋๋ฐ์! ๊ฐ๋จํ๊ฒ ๋ฐ์ดํฐ ์ฃผ๋ ์ฌ๋์ด๋ ๋ฐ์ดํฐ ๋ฐ๋ ์ฌ๋์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๊ฒ ์ฃ ?? ๐ | ||
|
||
์ด ๋ ๋ฐ์ดํฐ์ ํ๋ฆ์ Uni-directional ์ ๋๋ค. ์์ฐ์ ์ชฝ์์ ์๋น์ ์ชฝ์ผ๋ก ํ์ชฝ์ผ๋ก๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋ฉ๋๋ค. | ||
|
||
๐ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณด์ฃ ! | ||
|
||
- ๋ฐ์ดํฐ ์์ฐ์ : ์ต์ ๋ฒ๋ธ (Observable) + ์ต์ ๋ฒ๋ธํ์ (Observable Type)์ ์ฑ์ฉํ ๋ชจ๋ ํ์ | ||
- ๋ฐ์ดํฐ ์๋น์ : UIComponent (Label๊ณผ ImageView์ ๊ฐ์) | ||
|
||
### Binder (Subscribe ํ์ฅํ) | ||
|
||
**๋ฐ์ธ๋๋ UI ๋ฐ์ธ๋ฉ์ ์ฌ์ฉ๋๋ ํน๋ณํ ์ต์ ๋ฒ**์ ๋๋ค. ๋ฐ์ดํฐ ์๋น์์ ์ญํ ์ ํ๊ฒ ๋๋๋ฐ์. ์ต์ ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ์ต์ ๋ฒ๋ธ์ด ๋ฐ์ธ๋์๊ฒ ๋ฐ์ดํฐ ์ ๋ฌ์ ๊ฐ๋ฅํ๋ฐ, ๋ฐ์ธ๋๋ ์ต์ ๋ฒ๋ธ์ด ์๋๋ผ์ ๊ตฌ๋ ์๋ฅผ ์ถ๊ฐํ์ง๋ ๋ชปํด์!! | ||
|
||
์ฌ๊ธฐ์ ์ ๊นโผ๏ธ ์ค์ํ ํค ํฌ์ธํธ | ||
|
||
- **Binder๋ Error ์ด๋ฒคํธ๋ฅผ ๋ฐ์ง ์์ต๋๋ค.** | ||
- ์ต์ ๋ฒ๋ธ์ Next, Completed, Error ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๋๋ฐ Error๋ฅผ ๋ฐ์ง ์๋๋ค๋๊ฑฐ์ฃ ! ์กฐ๊ธ๋ง ์๊ฐํด๋ณด๋ฉด ๊ทธ ์ด์ ๋ฅผ ์ ์ ์๋๋ฐ์?! | ||
- ์, ์ผ๋จ Error์ด๋ฒคํธ๊ฐ ๋ฐ์๋๋ฉด ์ต์ ๋ฒ๋ธ์ด ์ด๋ป๊ฒ ๋๋์?? | ||
- ์ต์ ๋ฒ๋ธ ์ํ์ค๊ฐ ์ข ๋ฃ๊ฐ ๋์ด๋ฒ๋ฆฌ์ฃ ..!! | ||
- UI์ ๊ฒฝ์ฐ ๋ฐ๋ ๊ฒฐ๊ณผ๋ ๊ฐ์ ๋ฐ๋ผ์ ๊ณ์ํด์ ์ ๋ฐ์ดํธ๊ฐ ๋์ด์ผ ํ๋๋ฐ ์ข ๋ฃ๊ฐ ๋์ด๋ฒ๋ฆฌ๋ฉด ๋ ์ด์ Next ์ด๋ฒคํธ๋ฅผ ๋ฐ์ง ๋ชปํด์ ์ ๋ฐ์ดํธ๊ฐ ๋ถ๊ฐ๋ฅํ์ฃ ?? | ||
|
||
**โ ๊ทธ๋์ Error ์ด๋ฒคํธ๋ No No!!** | ||
|
||
๋ฐ์ธ๋ฉ์ด ์ฑ๊ณตํ๋ฉด UI๊ฐ ์ ๋ฐ์ดํธ ๋ฉ๋๋ค~~ ๋๋ฐ ๐ | ||
|
||
- **UI** ๊ด๋ จ ์์ ์ **Main Thread** ์์ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋์ฃ ? | ||
|
||
~~(ํน์๋,,, ๋ชจ๋ฅด๋ฉด,,, ์ง์ง๋ก ์ ๋ผใ ใ )~~ ์๋ ๋ชจ๋ฅผ ์๋ ์์ฃ ๐ ์ด์จ๋ ๊ทธ๋ ์ต๋๋ค. UI ๊ด๋ จํด์ ์ ๋ฐ์ดํธํ๋ ์์ ์ ๋ฉ์ธ ์ค๋ ๋์์ ์ฒ๋ฆฌ๊ฐ ์งํ๋ฉ๋๋ค. | ||
|
||
**โ Binder๋ Binding์ด ๋ฉ์ธ ์ค๋ ๋์์ ์งํ๋๋ ๊ฒ์ ๋ณด์ฅํด์ค๋๋ค.** | ||
|
||
cf) Subscribe ์ฌ์ฉํ์๋์ ๋น๊ตํด๋ณด๊ธฐ | ||
|
||
```swift | ||
let bag = DisposeBag() | ||
|
||
// ๋ฌธ์ ๊ฐ ๋๊ณ ์๋ ์ฝ๋ | ||
// UI ๊ด๋ จ ์ฝ๋๋ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋์ด์ผ ํ๋ค๊ณ !! | ||
textField.rx.text | ||
.subscribe(onNext: { [weak self] str in | ||
self?.textLabel.text = str // #1 | ||
}) | ||
.disposed(by: bag) | ||
|
||
// ํด๊ฒฐ์ฑ 1. GCD ์ฌ์ฉํ๊ธฐ (์ค๋ ๋ ์ง์ ) | ||
textField.rx.text | ||
.subscribe(onNext: { [weak self] str in | ||
DispatchQueue.main.async { | ||
self?.textLabel.text = str | ||
} | ||
}) | ||
.disposed(by: bag) | ||
|
||
// ํด๊ฒฐ์ฑ 2. rx์ observeOn ๋ฉ์๋ ์ฌ์ฉ (๋ฉ์ธ ์ค๋ ๋์์ ๋์ํ๋๋ก) | ||
textField.rx.text | ||
.observeOn(MainScheduler.instance) | ||
.subscribe(onNext: { [weak self] str in | ||
self?.textLabel.text = str | ||
}) | ||
.disposed(by: bad) | ||
``` | ||
|
||
๊ทผ๋ฐ RxCocoa์์๋ ์์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด์ฉํ์ง ์์์.. ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค!! | ||
|
||
๋ฐ๋ก bind ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ..! | ||
|
||
```swift | ||
// binder๋ ํญ์ ๋ฉ์ธ ์ค๋ ๋์์ ๋ฐ์ธ๋ฉ์ ์งํํ๋ค๊ณ ํ์์ฃ ? | ||
// ์์์์ฒ๋ผ ์ค๋ ๋ ์ง์ ํ๋ ๊ณ ๋ฏผ์ ํ ํ์๊ฐ ์์ด์... | ||
// ๊ทธ๋ฅ bind์์๋ค!! | ||
textField.rx.text | ||
.bind(to: textLabel.rx.text) // ํ๋ผ๋ฏธํฐ๋ก ObserverType์ ๋ฐ๊ณ ์์ด์. | ||
.disposed(by: bag) | ||
``` | ||
|
||
**๋ฐ์ธ๋ฉ+๋ฐ์ธ๋ ๊ฐ๋ ํ์ธํ์ผ๋๊น ์ฝ๋ ์์ฑํ๋ฌ ๊ณ ๊ณ ๊ณ ~~~๐ค** | ||
|
||
- **Binding ๊ตฌํ ์์ ** โถ๏ธ ์ ๋ถ๋ถ์ ๊ด์ฐฎ์๊ฑฐ ์๊ธธ๋๋ง๋ค ์ถ๊ฐํ ๊ฒ์~ | ||
|
||
**์์งํ ์ฌ๊ธฐ๊น์ง ์์ ๋ ๊ธฐ์ต๋๋๊ฑฐ..** | ||
|
||
- RxCocoa๊ฐ ๋ญ์๋๋ผ...? | ||
- **Binding,, Binder,, bind ๋ฉ์๋,, ๋ฉ์ธ ์ค๋ ๋..? (Good๐)** | ||
- ์ด๊ฒ๋ง ๊ธฐ์ต๋๋ ์ฑ๊ณต! ์ฌ์ฉ๋ฒ๋ง ์ตํ๋ก์๋ค~ | ||
|
||
--- | ||
|
||
## Traits | ||
|
||
`UI์ ํนํ๋ Observable` `Binder์๋ ๋ฐ๋..` `Driver๋ง ๊ธฐ์ตํด๋ ์ ๋ฐ ์ฑ๊ณต` | ||
|
||
Traits๋ UI ์ฒ๋ฆฌ์ ํนํ๋ Observable ์ ๋๋ค. ์ต์ ๋ฒ๋ธ์ด๊ธฐ ๋๋ฌธ์, UI Binding์์ ๋ฐ์ดํฐ ์์ฐ์ ์ญํ ์ ์ํํ๊ฒ ์ฃ ? ๊ธฐ์ต ์๋๋ฉด ์์์ ๋ฐ์ธ๋ฉ(Binding)๊ฐ๋ ๋ค์ ๋ณด๊ณ ์ค๊ธฐ๐ ํ๋ง๋๋ก Binder์ ๋ฐ๋๋๋ ๊ฐ๋ ์ธ๋ฐ RxCocoa์์ 4๊ฐ์ง ์ฃผ์ํ Traits๊ฐ ์๋๋ฐ์~ ์์๋ณผ๊น์~~~~?!!! | ||
|
||
Traits๋ ์์์ ๋งํ๋ฏ์ด UI์ ํนํ๋ ์ต์ ๋ฒ๋ธ์ด๊ณ , ๋ชจ๋ ์์ ์ ๋ฉ์ธ ์ค์ผ์ฅด๋ฌ(Main Scheduler)์์ ์คํ์ด ๋ฉ๋๋ค. ํ๋ง๋๋ก **๋ฉ์ธ ์ค๋ ๋(Main Thread)**์์ ์คํ๋๋ค๋ ์ด์ผ๊ธฐ์์!! | ||
|
||
Wow~~?! ๊ทธ๋ฌ๋ฉด ๋ฐ๋ก ์ค์ผ์ฅด๋ฌ๋ฅผ ์ง์ ํ ํ์๊ฐ ์์ด์..!!!! Amazing?! | ||
|
||
### โผ๏ธ **์ค์** | ||
|
||
์ฌ๊ธฐ์ ์ ๊น, ์ ๊น๋ง ์ง๊ณ ๋์ด๊ฐ ์ด์ผ๊ธฐ๊ฐ ์์ด์.. ๋ง์ฝ์ ์ต์ ๋ฒ๋ธ ์ํ์ค๊ฐ ์๋ฌ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ๋ค๋ฉด? ์๋ฌ ์ด๋ฒคํธ๋ก ์ข ๋ฃ๋๋ค๋ฉด ์ฐ๊ฒฐ๋์ด ์๋ UI๋ ์ด๋ป๊ฒ ๋ ๊น์? | ||
|
||
**๋ง์์.. ๋ ์ด์ UI ์ ๋ฐ์ดํธ๊ฐ ์ผ์ด๋์ง ์๊ฒ ์ฃ ? ์ค๊ฐ์ ์๋ฌ ํ ๋ฒ ๋ฐ์ํด๋ฒ๋ฆฌ๋ฉด ๋ ์ด์ ์ ๋ฐ์ดํธ๊ฐ ์๋๋๊น ์ ๋ง๋ก ํฐ์ผ์ด์์..** | ||
|
||
๊ทธ๋์ ์ฐ๋ฆฌ๋ Traits๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. | ||
Traits๋ **์๋ฌ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ์ง ์์์** ์ ๋ฌธ์ ๋ ๊ฑฑ์ ํ์ง ์์๋ ๋ฉ๋๋ค!!! | ||
|
||
์, ๊ทธ๋ฆฌ๊ณ ์๋ ์ต์ ๋ฒ๋ธ์ ๊ตฌ๋ ํ๋ฉด ์๋ก์ด ์ํ์ค๊ฐ ์์์ด ๋์์์?? ๊ทผ๋ฐ Traits๋ ์ต์ ๋ฒ๋ธ์์๋ ๋ถ๊ตฌํ๊ณ ์๋ก์ด ์ํ์ค๊ฐ ์์๋์ง ์์์..! | ||
|
||
### Traits ์ ๊น ์ ๋ฆฌ | ||
|
||
- UI์ ํนํ๋ ์ต์ ๋ฒ๋ธ | ||
- ๋ฉ์ธ ์ค๋ ๋์์ ์คํ | ||
- ์๋ฌ ์ด๋ฒคํธ ์ ๋ฌ โ | ||
- ์๋ก์ด ์ํ์ค ์์ โ | ||
|
||
์์งํ ์์์ ์ข์ ์ ๋ง ์ด์ผ๊ธฐํ๊ธฐ๋ ํ๊ณ ,, ์ฌ์ฉํ์ง ์์ ์ด์ ๊ฐ ๋ฑํ ์์ด์..! | ||
|
||
๊ทธ๋์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค๊ณ ํฉ๋๋ค! (๊ทผ๋ฐ ํ์๋ ์๋๋๋ค!) | ||
|
||
์ ์ ์ ๋ญ๊ฐ ๋๋ฌด ๋ด์ฉ์ด ๋์ด๋๊ณ ์๋๋ฐ ~~(๋ด ์๋ฉด์๊ฐ์ ์ค์ด๋๋์ค..ใ ใ )~~ | ||
|
||
Traits 4๊ฐ์ง๋ง ์ ๋ฆฌํ๊ณ ๊ฐ๋ ์ ์ธ ๋ถ๋ถ์ ๋ง๋ฌด๋ฆฌํ๋๋ก ํฉ์๋ค.. | ||
|
||
`control property` `control event` `driver` `signal` | ||
|
||
### Traits ์ข ๋ฅ | ||
|
||
1. **Control Property** | ||
|
||
์ปจํธ๋กค์ data๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด์ ์ฌ์ฉํฉ๋๋ค. | ||
|
||
 | ||
|
||
- RxCocoa๋ Extension์ผ๋ก Cocoa์ View๋ฅผ ํ์ฅํ๊ณ , ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์์ฑ์ ์ถ๊ฐํฉ๋๋ค. | ||
- ์ด๋ฐ ์์ฑ๋ค ๋๋ถ๋ถ Control Property ํ์์ผ๋ก ์ ์ธ๋์ด ์์ด์.. | ||
- ControlPropertyType ํ๋กํ ์ฝ์ ObservableType๊ณผ ObserverType ํ๋กํ ์ฝ์ ์์ํ๊ณ ์์ต๋๋ค. | ||
- ControlProperty๋ ํน๋ณํ ์ต์ ๋ฒ๋ธ์ด๋ฉด์ ๋์์ ํน๋ณํ ์ต์ ๋ฒ์ ๋๋ค. | ||
|
||
โ ์ฌ๊ธฐ์ Subject๊ฐ ๋ ์ค๋ฅด๋ ๊ฑด... ๋๋ง...๊ทธ๋ฐ๊ฑด๊ฐ | ||
|
||
- UI Binding์ ์ฌ์ฉ๋๋๋ฐ์.. ๊ทธ๋์ ์๋ฌ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ ๋ฐ์ง๋ ์๊ณ , ์ ๋ฌ ํ์ง๋ ์์ต๋๋ค. | ||
|
||
2. **Control Event** | ||
|
||
์ปจํธ๋กค์ ์ด๋ฒคํธ๋ฅผ ์์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. | ||
|
||
 | ||
|
||
- UI Control์ ์์ํ Control๋ค์ ๋ค์ํ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํฉ๋๋ค. | ||
- ControlProperty์ ๋ฌ๋ฆฌ Observable์ ์ญํ ์ ์ํํ์ง๋ง Observer์ ์ญํ ์ ์ํํ์ง ๋ชปํฉ๋๋ค. | ||
- ์๋ฌ ์ด๋ฒคํธ ์ ๋ฌํ์ง ์๊ตฌ์, Completed ์ด๋ฒคํธ๋ Control์ด ํด์ ๋๊ธฐ ์ง์ ์ ์ ๋ฌํฉ๋๋ค! | ||
- ๋ฉ์ธ ์ค์ผ์ฅด๋ฌ์์ ์ด๋ฒคํธ ์ ๋ฌํฉ๋๋ค. | ||
3. **โญ๏ธ โญ๏ธ โญ๏ธ Driver** | ||
|
||
RxCocoa๊ฐ ์ ๊ณตํ๋ Traits ์ค์์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ๊ฒ์ด๋ผ๊ณ ๋ด๋ ๊ณผ์ธ์ด ์๋๋๋ค. | ||
|
||
Driver๋ ๋ฐ์ดํฐ๋ฅผ UI์ ๋ฐ์ธ๋ฉํ๋ ์ง๊ด์ ์ด๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค! | ||
|
||
**๋ช ๊ฐ์ง ํน์ง**์ ๊ฐ์ง๋๋ฐ, | ||
|
||
- ์๋ฌ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ์ง ์์์ โ ์ค๋ฅ๋ก ์ธํด์ UI ์ฒ๋ฆฌ๊ฐ ์ค๋จ๋์ง ์๊ฒ ์ฃ ? | ||
- ํญ์ ๋ฉ์ธ ์ค์ผ์ฅด๋ฌ์์ ์์ ์ ์ํํด์ โ ์ด๋ฒคํธ๋ ํญ์ ๋ฉ์ธ ์ค์ผ์ฅด๋ฌ์์ ์ ๋ฌ๋๊ณ , ์ด์ด์ง๋ ์์ ๋ ๋ฉ์ธ ์ค์ผ์ฅด๋ฌ์์ ์ฒ๋ฆฌํฉ๋๋ค. | ||
|
||
**์์ ์ฝ๋** | ||
|
||
```swift | ||
viewModel.output.isLoading | ||
.asDriver() | ||
.drive(onNext: { [weak self] in | ||
self?.indicatorView.isHidden = !$0 | ||
}) | ||
.disposed(by: disposeBag) | ||
|
||
viewModel.output.isLoading | ||
.observeOn(MainScheduler.instance) | ||
.subscribe(onNext: { [weak self] in | ||
self?.indicatorView.isHidden = !$0 | ||
}) | ||
.disposed(by: disposeBag) | ||
``` | ||
|
||
drive๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด asDriver() ๋ฉ์๋๋ฅผ ํตํด์ ์ต์ ๋ฒ๋ธ์ Driver ํ์ ์ผ๋ก ๋ง๋ค์ด์ฃผ์ด์ผ ํฉ๋๋ค! | ||
|
||
4. **Signal (์๋ ๊ทธ๋ฅ ํน์ง๋ง ๋ณด๊ณ ๋์ด๊ฐ์๋ค! ํน์ ํ์ํ๋ฉด ๋ค์ ์ฐพ์๋ณด๋ฉด ์ข์ ๋ฏํด์)** | ||
|
||
Driver์ ๊ฑฐ์ ๋์ผํ๋ฐ, ํ ๊ฐ์ง ๋ค๋ฅธ ์ ์ ์์์ ๊ณต์ ํ์ง ์๋๋ค๋๊ฑฐ์์! | ||
|
||
โ share(replay:1) ์ฌ์ฉํ์ง ์์์..! โ ์๋ก์ด ๊ตฌ๋ ์์๊ฒ ๋ง์ง๋ง ์์๋ฅผ ๋ณด๋ด์ฃผ์ง ์์์! | ||
|
||
--- | ||
|
||
### ๐ ํ..? | ||
|
||
[์ถ์ฒ]: [https://nsios.tistory.com/66](https://nsios.tistory.com/66) | ||
|
||
- drive๋ UI์ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ด๋ค๊ณ ํฉ๋๋ค. | ||
- relay์ drive๋ฅผ ํตํด์ ์์ ํ๊ฒ ์ฌ์ฉํ๊ตฌ์. | ||
- ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ ์ฅํ ๋๋ bind๋ subscribe๋ฅผ subject์ ์ฌ์ฉํ๋ ํธ..ใ | ||
|
||
์์ด๊ณ ,, ์ ๋ด์ฉ ๋ฐํ์ผ๋ก ๋ค์ ํ ๋ฒ ์ ๋ฆฌํด์ผ๊ฒ ๋ค... ์์ง ๋ฌ๊ตฌ๋ฆ ์ก๋ ๋๋ โ๏ธ | ||
|
||
<br> | ||
|
||
## ๐ ์ฐธ๊ณ ์๋ฃ | ||
[[RxCocoa] 1. ๋ง๋ณด๊ธฐ](https://ios-development.tistory.com/137?category=909631) | ||
|
||
[RxSwift 12) RxCocoa - 2/2](https://iospanda.tistory.com/entry/RxSwift-11-RxCocoa-22?category=751847) | ||
|
||
[[RxSwift Book] Chapter 12: Beginning RxCocoa](https://jusung.github.io/RxSwift-Section12/) | ||
|
||
[[RxSwift] bind, subscribe, drive](https://nsios.tistory.com/66) |