Skip to content

Commit

Permalink
docs: RxCocoa.md ์ถ”๊ฐ€
Browse files Browse the repository at this point in the history
  • Loading branch information
Taehyeon-Kim authored May 12, 2021
1 parent 653b429 commit f189024
Showing 1 changed file with 299 additions and 0 deletions.
299 changes: 299 additions & 0 deletions Docs/RxCocoa.md
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๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

![controlProperty](https://user-images.githubusercontent.com/61109660/117992264-c0ae5f80-b379-11eb-9011-0ba9f8fe85a8.png)

- RxCocoa๋Š” Extension์œผ๋กœ Cocoa์˜ View๋ฅผ ํ™•์žฅํ•˜๊ณ , ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
- ์ด๋Ÿฐ ์†์„ฑ๋“ค ๋Œ€๋ถ€๋ถ„ Control Property ํ˜•์‹์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์–ด์š”..
- ControlPropertyType ํ”„๋กœํ† ์ฝœ์€ ObservableType๊ณผ ObserverType ํ”„๋กœํ† ์ฝœ์„ ์ƒ์†ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
- ControlProperty๋Š” ํŠน๋ณ„ํ•œ ์˜ต์ €๋ฒ„๋ธ”์ด๋ฉด์„œ ๋™์‹œ์— ํŠน๋ณ„ํ•œ ์˜ต์ €๋ฒ„์ž…๋‹ˆ๋‹ค.

โ†’ ์—ฌ๊ธฐ์„œ Subject๊ฐ€ ๋– ์˜ค๋ฅด๋Š” ๊ฑด... ๋‚˜๋งŒ...๊ทธ๋Ÿฐ๊ฑด๊ฐ€

- UI Binding์— ์‚ฌ์šฉ๋˜๋Š”๋ฐ์š”.. ๊ทธ๋ž˜์„œ ์—๋Ÿฌ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ ๋ฐ›์ง€๋„ ์•Š๊ณ , ์ „๋‹ฌ ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

2. **Control Event**

์ปจํŠธ๋กค์˜ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

![controlEvent](https://user-images.githubusercontent.com/61109660/117992305-cad05e00-b379-11eb-8692-b48e252574ca.png)

- 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)

0 comments on commit f189024

Please sign in to comment.