09 Apr 2018
|
TIL
2018.04.09
- ์ํ๊ธฐ์ฑ step8 PR..
- ํ์ด๊ทธ๋ํ ๊ณ์ฐํ ๋ ๋ผ๋์๊ณต์์ ๋ผ๋์๊ฐ์ด ์๋ ๊ฐ๋๊ฐ์ ๋ฃ์ด์ ์ํ์ฐฉ์ค๊ฐ ์์์ง๋ง ํ์ด(๋ถ์ฑ๊ผด)๋ชจ์์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ ์ฑ๊ณต
- pipe operator๊ฐ์: custom operator ์ค์ , ํด๋ก์ ์ pipe operator๋ฅผ ๊ฒฐํฉํด์ ๊ฐ๋
์ฑ์ด ์ข์ ํจ์ํํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๋ค.
- mapValue
- reduce
let arr = [1,2,3,4,5,6,7,8,9,10]
arr.count
let runningSum = arr
.reduce(into: []) { $0.append(($0.last ?? 0) + $1) }
// [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
runningSum.count
- ์์ ์์ทจ์ ์๋ ์ ์ ์์น ๊ตฌํ๊ธฐ - ํ์ด๊ทธ๋ํ ๊ทธ๋ฆด ๋ ํ์ํ์
2018.04.10 ~ 11
- ์ํ๊ธฐ ํผ๋๋ฐฑ ์ฒ๋ฆฌ
- ํผ๋๋ฐฑ ์ฒ๋ฆฌ ์๋ฃ & step8 ๋จธ์ง!
- ์ํ๊ธฐ ๋ง์ง๋ง๋จ๊ณ step9์์
- ํ์ด๊ทธ๋ํ๋ฅผ ๋๋๊ทธํด์ ํฌ๊ธฐ๋ฅผ ๋ฌ๋ฆฌํ๊ณ ์๋ก ๊ทธ๋ฆผ
- ์ ์ค์ณ, ํฐ์น์ด๋ฒคํธ ์ ์ฉ
- ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ color๋ฅผ ํ
๋ง๋ณ๋ก enum์ผ๋ก ์ ์ธํด์ ๋งค๋ฒ ๋๋ค์ผ๋ก ์ ํ ๊ฐ๋ฅํ๋๋ก ์ค์
- enum๋ด์ ์์ฑ๊ณผ ํจ์ ์ ์ธํด์ ์ฌ์ฉํด๋ด
2018.04.12
- ์นด๋๊ฒ์ ์์ step1
- ์ํ๊ธฐ ๋ง์ง๋ง๋จ๊ณ ์ด์ ์ ๋ฆฌํ๊ธฐ https://github.com/jinios/swift-vendingmachineapp/issues/5
- ์นด๋๊ฒ์ step1 ๋จธ์ง
2018.04.13
- ์นด๋๊ฒ์ step2 ์์ฑ ๋ฐ PR๋ณด๋
- addSubView, removeFromSuperView()
- UIResponder - motionEnded
- ์ปค์คํ
๋ทฐ ํด๋์ค ๋ง๋ค๊ณ ์์ฑ ์ง์ ํ๊ธฐ: ์ด๋ ๊ฒํ๋ฉด ํด๋น ํด๋์คํ์
์ ๋ทฐ๋ ํด๋น ์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ๋ฐ๊ฒ(?)๋จ
- ์ฝ๋๋ก ์ถ๊ฐํ view์ ์์ฑ์ ์ ์ฉํ๊ธฐ ์ํด์๋
init(frame:)
์ ์์ฑ์ ์ง์ ํด์ค์ผํ๋ค. (๊ด๋ จํฌ์คํ
!)
```swift
override init(frame: CGRect) { // by code
super.init(frame: frame)
self.layer.cornerRadius = 5.0
self.clipsToBounds = true
}
convenience init() {
self.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
}
```
04 Apr 2018
|
iOS
service
์์ฒญ๋ ๋ง์ ๊ฒฝ์ฐ์ ์๊ฐ ์๊ฒ ์ง๋ง ์ผ๋จ ์ผํ๋ฉด์ ์๊ฐํด๋ณธ ๋ช ๊ฐ์ง์ ์ํฉ์ ์ ๋ฆฌํ๊ณ ์ถ์๋ค.
์๋น์ค๋ฅผ ์ด์ํ๋ฉด์ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ๋ ํฌ๋์/ํน์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ ์ํฉ๋ค์ ์๊ฐํด๋ณธ๋ค๋ฉด,
์ธํฐ๋ท์ด ์๋๋ ๊ฒฝ์ฐ
- ์ด๊ฑด ์ค์ ๋ก ํ์ฑํ๋์ด์๋ ์๋น์ค์ ๊ฒฝ์ฐ ์ฑ ๋ด์ ์ต์ ๋ฒ๊ฐ ์์ด์ ๋คํธ์ํฌ ๋ณ๊ฒฝ์ด ๊ฐ์ง๋ ์๊ฐ ์๋ฆผ์ด๋ block์ก์
์ด ๋์ฌ ํ๋ฅ ์ด ํฌ์ง๋ง, ๋คํธ์ํฌ ์์ฒญ์ ํ๋ ์๊ฐ ์ฌ์ฉ์์ ๋คํธ์ํฌ ํ๊ฒฝ์ด ๋ณํ๋ ์๋ ์๋ค.
ํ์
์ด ๋ค๋ฅธ ๊ฒฝ์ฐ
- ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์๋ชป ๋ด๋ ค์ค์ ํน์ ํด๋ผ์ด์ธํธ์์ ๋ค๋ฅธ ํ์
์ผ๋ก ํ์ฑ์ ์๋ํด์ ํฌ๋์ ๋๋ ๊ฒฝ์ฐ
- ๋ฐ์ดํฐ ์์ฒด๋ ๋ฐ์์์ผ๋ฏ๋ก http response ์ฝ๋๋ ์ ์์ด๊ณ , request๋ฅผ ์์ฒญํ๋ ๋ฉ์๋์ ๋น๋๊ธฐ ๋ธ๋ญ ๋ด์์๋ successํด๋ก์ ๋ฅผ ์คํํ๋ค.
- ๋ฐ๋ผ์ http์์ฒญ๊ณผ ์๋ต ์์ฒด๋ ์ ์์ด์ง๋ง, ๋ฐ์ดํฐ์ ํ์
์ด ๋ค๋ฅธ๋ฐ ํ์ฑ์ ์๋ํด์ ํฌ๋์๋๋ ๊ฒฝ์ฐ์ด๋ค.
๋ฐ์ดํฐ ๊ฐ์ฒด์ ๋ด๋ถ ํ๋กํผํฐ๊ฐ nil์ธ๋ฐ ์ ๊ทผํ๋ ค๋ ๊ฒฝ์ฐ
- ์๋ฒ์์ ๋ฐ์ดํฐ๊ฐ ๋ด๋ ค์์ ๊ฐ์ฒด๋ก ํ์ฑ๋์์๋ ๋ด๋ถ ํ๋กํผํฐ๊ฐ nil์ธ ๊ฒฝ์ฐ๊ฐ ์ข ํท๊ฐ๋ฆฌ๋ ๊ฒฝ์ฐ์๋๋ฐ,
- ๋ฐ์ดํฐ์์ฒด๋ ์ ๋ด๋ ค์์ response์ฝ๋๋ 200์ด์ง๋ง ๋ด๋ถ ํ๋กํผํฐ๊ฐ nil์ด๊ธฐ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ์๋ชป ๋ด๋ ค์จ ๊ฒฝ์ฐ์ด๋ค. ์ด๋๋ fail๋ธ๋ญ์์ ์๋ฌ๊ฐ ๊ฐ์ง๋์ง ์๋๋ค.
- ์ด ๊ฒฝ์ฐ์ success๋ธ๋ญ์์ ํ์ฑ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ๋ด๋ถ ํ๋กํผํฐ๋ฅผ ๊ฐ์ ธ์์ ์ธ๋ nil์ธ ๊ฒฝ์ฐ๋ ์ฒดํฌํด์ผํ๋ค.
- ์์ฝ: ๋ฐ์ดํฐ๊ฐ ๋ด๋ ค์์ object๋ก ํ์ฑ๋ ๊ฐ์ฒด๋ด์ item์ด nil์ด์ด๋ http response๋ ์ ์์ฝ๋๋ก ๋ด๋ ค์ฌ ์ ์๋ค. ๋ฐ๋ผ์ fail๋ธ๋ญ์์ ๊ฑธ๋ฌ์ง์ง ์๋ ์๋ฌ ๋ฐ์ ํ ์ ์์. ๊ฐ์ฒด ๋ด์ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ๋ ์์ฒด์ ๊ฒ์ฆ๋ ํ์ํ๋ฉฐ, ์ผ๋ฐ fail๋ธ๋ญ์์ ์ฒ๋ฆฌ๋๋ ์๋ฌ์ ๋์ผํ ๋ฐฉํฅ์ผ๋ก ์ฒ๋ฆฌํ ์ง/๋ง์ง๋ ์ฌ๋ฌ ํํธ(๊ธฐํ/์๋ฒ/ํด๋ผ)์ ๋
ผ์ํด์ ๊ฒฐ์ ํ๋ ๊ฒ์ด ์ข์๋ฏ!
02 Apr 2018
|
TIL
2018.04.02
- ์ํ๊ธฐ step6 ํผ๋๋ฐฑ์ฒ๋ฆฌ
- (UIView)UIImageview: frame, bound, addSubVIew โฆ
- ์๋ฃ๊ตฌ๋งค ํ์คํ ๋ฆฌ๊ฐ ํ์๋ ๋ ์๊พธ ํ๋ฉด ์ค๊ฐ๋ถํฐ ํ์๋๋ ๋ฌธ์
- ์ด์ ์ ์ฑ์ ์คํํ์๋ ์ ์ฅ๋๋ ํ์คํ ๋ฆฌ๋ฐ์ดํฐ๊ฐ ์๊ณ , ๊ทธ ์๋ก ๊ตฌ๋งค๋ด์ญ์ด ์์ด๋ฉด์ x์ถ์ด ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๋ ค๋ฌ๋๊ฒ. ํ์ง๋ง ์ด์ ์ ์์นด์ด๋น๋ ํ์คํ ๋ฆฌ ๋ฐ์ดํฐ๋ view์ ํ์๋์ง์์์ ์ค๊ฐ๋ถํฐ ์๋ฃ์ ์์ดํ
์ด๋ฏธ์ง๊ฐ ์์ธ๊ฒ์ฒ๋ผ ๋ณด์ธ๊ฒ์
- viewDidLoad์์ ์ฒ์ ์ธํ
ํ ๋ ํ์คํ ๋ฆฌ ์์นด์ด๋น๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์๋ ์๋ ๋ฐ์ดํฐ๋ค์ ๋ทฐ๋ก ํ์ํด์ฃผ๋ ์ธํ
๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ํ ๊ฒ๊ฐ๋ค
- ์๋ฃ ์ถ๊ฐ์ ์ฌ๊ณ 0๊ฐ์๋ ์์ดํ
์ ์ถ๊ฐํ ๋ stock์ด ์
๋ฐ์ดํธ ๋์ง ์์ ๋ฌธ์ . 5๋จ๊ณ์์ ์๋ฃ๋ฅผ ๊ตฌ๋งคํ๊ฑฐ๋ ์ถ๊ฐํ๋ฉด์ ์ฌ๊ณ ์ํ๊ฐ ๋ฐ๋๋๋ง๋ค shelf update๋ฅผํด์ ์์๊ฐ ๋ฐ๋์ด์ ๋ฒํธ๊ฐ ๋ค์ฃฝ๋ฐ์ฃฝ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ updateํ๋ ๋์์ ๋ค ์์ด๋๋ฐ, ์ด๋ฌ๋ฉด์ 0๊ฐ์์ ์ ๋์
๋๋ฆฌ ์
๋ฐ์ดํธ๊ฐ ํ์(key๋ฅผ ์ถ๊ฐํด์ผํ๊ธฐ๋๋ฌธ์)ํ๋ฐ ์ด ๋์์ ์์ ๋ฒ๋ ค์ 0๊ฐ์ธ key๋ ์ถ๊ฐํด๋ ์ถ๊ฐ๋์ง์์๋๊ฒ
// Stock.swift
func addItem(_ item: Beverage) {
for set in self.inventory {
if var arr = self.inventory[ObjectIdentifier(type(of: item))] {
arr.append(item)
self.inventory[ObjectIdentifier(type(of: item))] = arr
break
} else if set.key != ObjectIdentifier(type(of: item)) {
let newItemSet = [ObjectIdentifier(type(of: item)) : [item]]
self.inventory = self.inventory.update(other: newItemSet)
// self.inventory ์ด ๋ถ๋ถ์ด ๋ฌธ์ ๋ถ๋ถ์ด์์. ์ถ๊ฐํด์ ํด์ ํด๊ฒฐ.
}
}
}
- ์ถ๊ฐ๋ก StockController์์๋ update๋์์ ์ถ๊ฐํด์คฌ๋ค.
```swift
// StockController.swift
func addItem(item: Beverage) {
self.stock.addItem(item)
self.history.addSupplyLog(item)
self.shelf = shelf.update(newItems: self.stock.currentInventory())
}
// Shelf.Swift
func update(newItems: [ObjectIdentifier: [Beverage]]) -> Shelf {
return Shelf(items: newItems)
}
- **์ด๋ ๊ฒํด์ ํด๊ฒฐ!** ํ๋๋ฐ ์ด๋ ๊ฒ ํ๋ฉด์ shelf๊ฐ ์
๋ฐ์ดํธ๊ฐ ๋๋ฉด์ newItems๋ก ๋์
๋๋ฆฌ๊ฐ ๋ฐ๋๊ณ , UIButton์ tag์์์ ์์๊ฐ ๋ง์ง์์. 1๋ฒ์ ๋๋ฅด๋ฉด 5๋ฒ ์๋ฃ๊ฐ ๋์ค๊ณ ...
- **์ฌ๊ณ ์๋ ์
๋ฐ์ดํธ ๋์ง๋ง (stock, inventory) ์๋ก์ด ๋์
๋๋ฆฌ set์ผ๋ก ๋์
๋๋ฆฌkey ์์๋ ๊ณ ์ ๋ ๊ฐ์ผ๋ก ๋จ๊ฒจ์ง๋๋ก! Shelf์ update()ํจ์๋ฅผ ๊ทธ๋ฅ ๊ณ ์ ๋ ์ด๊ธฐ๊ฐ์ Shelf()์ ๋๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํ๋๋ก ์์ !** ํ๋๋ฐ ์ธ์คํด์ค๋ฅผ ๊ตณ์ด ๋ง๋ค ํ์๋ ์์๊ฑฐ๊ฐ๊ณ StockController์์ shelf๋ง ์
๋ฐ์ดํธ ์ํ๋ฉด๋๋๊น ์ฝ๋๋ฅผ ์กฐ๊ธ ์๋ณผํ์๋ ์์ ๊ฒ ๊ฐ๋ค. ์ผ๋จ ํด๊ฒฐ!
```swift
// StockController.Swift
func addItem(item: Beverage) {
self.stock.addItem(item)
self.history.addSupplyLog(item)
}
// shelf๋ฅผ ์
๋ฐ์ดํธํ์ง ์์๋๋๋ฉด ๊ตณ์ด ์ฝ๋๋ฅผ ๋ฃ์ด์ค ํ์๊ฐ ์์ด์ ์ง์
// Shelf.swift
func update(newItems: [ObjectIdentifier: [Beverage]]) -> Shelf {
return Shelf()
}
// ํธ์ถํ๋๋ผ๋ ์์ ๊ทธ๋๋ก ๋ฆฌํด๋๋๋ก ๋ณ๊ฒฝ
2018.04.03
- ์ํ๊ธฐstep7 PR : UserMode๋ค์์ AdminModeVC๋ฅผ ๋ง๋ค์ด์ ๊ด๋ฆฌ์๋ชจ๋ ๋ฉ๋ด๋ฅผ ๋ถ๋ฆฌ(๋งจ ์ฒซ ํ๋ฉด์ ๋ฌด์กฐ๊ฑด UserMode, Container View Controller์์)
- ViewController์์ ๋ค๋ฅธ ViewController๋ก ๊ฐ์ ๋๊ฒจ์ค๋,
prepare(for segue:)
์ฌ์ฉ
- AppDelegate -> VC1(Root viewController) -> VC2(presented)๊ด๊ณ์์, VC1์ด VC2์ ์์ฑ๊ฐ์ ๋๊ฒจ์ฃผ๋ ๊ตฌ์กฐ์ผ๋
- VC1์์
prepare()
๋ฉ์๋ ์ฌ์ฉ, VC2์ ์์ฑ๊ฐ(VC2์ ์์ฑ์ ์ต์
๋)์ ํ ๋นํด์ค ์ ์๋ค.
- ์ฌ๊ธฐ์ VC1์ด VC2 ํด๋์ค๋ฅผ ๋ง๋ ๋ค(ํน์ ์ด๊ธฐํํ๋ค)๊ณ ์๊ฐ ํ ์ ์๋๋ฐ, ์ด๋ณด๋ค๋ ์ฑ์ด ์คํ๋ ๋ ์ด๋ฏธ VC1๊ณผ VC2๊ฐ ๋ง๋ค์ด์ง๊ณ VC2๊ฐ ํธ์ถ๋์ด ํ๋ฉด์ ๋์์ง๋ ์์ ์ VC1์ด ์์ฑ๊ฐ์ ํ ๋นํด์ค๋ค(๋ฃ์ด์ค๋ค)๋ ์๋ฏธ๋ก ์ดํดํด์ผ ๋ง๋ค.
prepare()
๋ฉ์๋๊ฐ ๋์ํ๋ ํ๋ฆ์ VC1์ด ๋์์ง ์ํ์์ ๋๊ธฐํ๊ณ ์๋ค๊ฐ, identifier๊ฐ ๋ง๋ segue๊ฐ ํธ์ถ๋๋ฉด ์์ ์ ๋ฉ์๋ ๋ด์ ๊ตฌํ๋์ด์๋ ๋์์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. prepare์์ ๋์ํ๋ ์์ ์ button์ด๋ผ๊ณ ์ฐฉ๊ฐํ ์ ์๋๋ฐ, ์ด๋ ๊ฒ ์๊ฐํ๋ฉด ์ฝ๋ค.
- button์ segue ํธ์ถํ๋ ๊ฒ์ผ๋ก๋ง ์ฐ๊ฒฐ -> segue๊ฐ ํธ์ถ๋๋ฉด ๋๊ธฐํ๊ณ ์๋ prepare๊ฐ ์์ ์ ๋์ ์คํ. ์ฌ๊ธฐ์ prepare()์ ์ ์๋ identifier๋ก ์ฌ๋ฐ๋ฅธ segue๋ฅผ ๊ตฌ๋ถํ๋ค.
2018.04.04
- ์ํ๊ธฐ ํผ๋๋ฐฑ ์์
2018.04.05
- ์ด์์ step7ํผ๋๋ฐฑ ์ถ๊ฐํ๊ธฐ, prepare์ถ๊ฐ
- stpe8 ์งํํ๊ธฐ
- ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ ์ฐธ๊ณ ๋์์ - ์คํ ํฌ๋ ๊ฐ์
- ๊ทธ๋ํ ๊ทธ๋ฆด๋, ํ์ด ๊ทธ๋ฆฌ๋ ๋ฉ์๋ ๋์ํ๋๊ฑธ ์๋ฉด ์์์ , ์ผํฐ, ๋๋๋์ง์ , ๊ฐ๋?๋ฑ์, ์ ์ฒด ํ๋งค์์ ํด๋น ์๋ฃ๋ง ํ๋งคํ ์๋ก ๊ณ์ฐํด์ ์ขํ์ ๊ฐ๋๋ฅผ ๊ณ์ฐํ๊ณ , ์๊ณ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๋๊ฑธ ์์๋ก ์ก์์๋ ์ด์ ํ์ด์ ๋๋๋ ์ขํ๊ฐ ๊ทธ ๋ค์ ํ์ด์ ์์์ ์ผ๋ก ์ก์ผ๋ฉด(์ผํฐ๋ ์ด์ฐจํผ ๋ชจ๋ ๋์ผ) ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณผ์์์ง์์๊น?,,,
- mapValues!!
- compactMap
- reduce!
2018.04.06
- ์ํ๊ธฐ step8 ์ฝ์ด๊ทธ๋ํฝ์ค
- ํ์ด๊ทธ๋ํ ์กฐ๊ฐ ๊ทธ๋ฆฌ๋ ๋ถ๋ถ drawํจ์์ ์ผ๋จ ๋ค ๊ตฌํํด๋ณด๊ธฐ(for loop์ฐ์ง ์๊ณ )
endAngles: [Beverage: CGFloat]?
ํ์ฉ
- ๊ด๋ จ ๋ด์ฉ ์คํ ํฌ๋ ๊ฐ์ ๋ฃ๊ธฐ
- ๋ฐ๋ณต๋ฌธ ์ถ๊ฐํด์ ๊ทธ๋ ธ๋๋ฐ ์ ์๋จโฆโฆ.์๊ณ ๋ณด๋ endAngles๊ฐ ๋ผ๋์ ๊ฐ์ด ์๋๋ผ ๊ฐ๋๊ฐ์ด์์..-_-
- ์๊ฐ๋๋ฉด reduce์ mapValues์ ๋ฆฌ
2018.04.08
- RxSwift๊ฐ ๊ถ๊ธํ์ฌ ReactiveX ๋ฅผ ๋จผ์ ์ฐพ์๋ณด๊ฒ๋์๋ค. (๋ง๊ธฐ์ ๊ฐ๋ฐ ๋ธ๋ก๊ทธ ์ฐธ๊ณ ํจ!)
- ์ผ๋จ ReactiveX์ ์ค์ํ ํค์๋๋
Asynchronous
, ๋ฐ์ํ(Reactive)
, ์ต์ ๋ฒํจํด
, ๋ฐ๋ณต์ ํจํด
, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
์ ๋์ธ ๊ฒ ๊ฐ๋ค.
- ๊ณต์์ ์ผ๋ก ๋์์๋ ์ ์ ๋ An API for asynchronous programming with observable streams. ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming
- ์์ญํ์๋ฉด ReactiveX๋ ๊ด์ฐฐ ๊ฐ๋ฅํ ํ๋ฆ๊ณผ ํจ๊ป ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํ API์ด๋ฉฐ, ์ต์ ๋ฒํจํด, ๋ฐ๋ณต์ ํจํด, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก๋ถํฐ ๋์จ ์ต๊ณ ์ ์กฐํฉ.
- ๋ด๊ฐ ์ดํดํ ReactiveX: ๋น๋๊ธฐ๋ฐฉ์์ผ๋ก ๋ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ ๊ด์ฐฐํ๋ฉด์ ํน์ ํ ๋(์๋ฒ ํต์ ์ ํ์๋, ํฐ์น์ด๋ฒคํธ๊ฐ ์์ ๋, ํ
์คํธํ๋์ ํน์ ํค์๋๊ฐ ์
๋ ฅ๋์๋)์ ๋ฐ์ํ์ฌ ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์!!
- RxCocoa ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ ๊ฒ๋ ์๋ค๊ณ ํ๋ค. ๋ป: iOS์ UI๋ค์ Rx๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ