[221027] TIL
Opened this issue · 2 comments
Taehyeon-Kim commented
// next, error, completed 이벤트를 모두 방출
.subscribe(onNext: { value in
self.stepButton.isEnabled = value
self.validationLabel.isHidden = value
})
// next 이벤트만 방출
// 이전에는 bind(to:)에 하나의 값만 연결해줄 수 있어서 다음과 같이 사용하는 경우도 많았음
// 순환 참조 문제도 해결해야 함
.bind(onNext: { value in
self.stepButton.isEnabled = value
self.validationLabel.isHidden = value
})
// 가변 매개변수로 해결 가능
// 가장 깔끔
.bind(to: stepButton.rx.isEnabled, validationLabel.rx.isHidden)
- subscribe - bind(onNext:) - bind(to:)
let validation = nameTextField.rx.text // String?
.orEmpty // String
.map { $0.count >= 8 } // Bool
validation
.bind(to: stepButton.rx.isEnabled, validationLabel.rx.isHidden) // next 이벤트만 방출(물론 subscribe 사용해도 됨. 그런데 목적상 맞는 것은 bind, 가변 매개변수를 받을 수 있음.
.disposed(by: disposeBag)
validation
.withUnretained(self)
.bind { vc, value in
vc.stepButton.backgroundColor = value ? .systemPink : .lightGray
}
.disposed(by: disposeBag)
- bind를 나누어서 사용한 이유는 Color의 경우 Bool값과 다이렉트로 매칭이 어렵다. 그렇기에 bind(onNext:)를 이용해서 클로저 안에서 이벤트 값에 대한 처리를 해주고 있다. 중복되는 부분은 상수로 묶어서 관리를 할 수 있다.
- 상수로 묶어놓은 시퀀스를 구독할 때마다 새로운 옵저버블 시퀀스가 생겨남. 불필요한 값들이 메모리에 중복해서 올라갈 수 있다는 것임. 만약 서버 통신과 엮어서 생각하면 불필요한 Call이 계속 생길 수 있다는 것임.
Taehyeon-Kim commented
Subsribe, Bind, Drive
Subscribe | Bind | Drive |
---|---|---|
next, error, completed 이벤트 방출 | next 이벤트 방출, 메인 스레드에서 동작 | stream 공유 |
- Bind, Drive는 UI 처리에 적합
Observable, Subject, Relay
Observable | Subject | Relay |
---|---|---|
- | Share를 내부적으로 구현하고 있어 Stream 공유 | UI에 최적화, Next 이벤트만 방출 |
Taehyeon-Kim commented
Git Rebase 이해하기
Merge
- fast-forward merge : HEAD의 위치가 이동하는 것
- 3-way merge : 분기된 시점 이후의 머지
Merge가 있는데 Rebase 왜 해?
merge commit을 만들고 싶지 않을 때 사용!
여러명이 여러 개의 브랜치를 만들고 작업을 하게 되면 불필요한 merge commit이 발생함. (브랜치를 깔끔하게 관리하지 못함)
📌 올리지 않은 작업 영역에 대해서만 rebase를 수행해야 한다.
📌 rebase 수행하고 올리기
- Base commit의 위치 이동(다시 베이스를 만든다.)
- 분기된 Branch가 바라보고 있는 Base의 위치를 마지막으로 바꾼다. (해당 브랜치의 가장 마지막 커밋으로 이동)
- Rebase는 Remote에 올라가지 않은 커밋에 대해 작업이 이루어져야 한다. (선 rebase, 후 remote push)
- 분기한 브랜치에서 rebase를 해줘야 한다. hue > main
- hue > git rebase main
- rebase와 merge는 다른 것. (base commit을 변경해서 구조를 바꾸는 것)
Interactive Rebase
중간 지점의 커밋에 대한 내용을 수정할 수 있음
사전 준비
git commit --allow-empty -m "git init"
- data 없는 root commit
- 변동 사항 없이 커밋을 만들어낼 수 있음
커밋 수정
- 수정하고자 하는 커밋의 전 커밋 아이디를 수정해야 함
- 그래서 첫 번째 커밋을 수정하는 것은 일반적으로 어려움(그래서 빈 커밋을 하나 만들어놓고 시작)