회고
어제와 마찬가지로 RxSwift를 정리하고, 이제 정말 과제를 시작해야겠다라고 생각했지만, 오늘도 시작하지 못했다. 정확히 얘기하자면 구상은 어느정도 진행이 되었지만, 실제 개발을 시작하지는 않았다는 얘기이다. RxSwift의 개념에 대해서는 어느 정도 이해를 하고있는 과정이라고 생각한다. 허나, 이 개념들을 어느 부분에 어떻게 사용해야할지 즉 활용에 대한 감이 아직은 크게 잡히지 않았다.
공부에 관한 기록
1. Observable
- Observable은 RxSwift의 핵심 개념으로, "시간이 지남에 따라 데이터를 흘려보내는 설계도"이다.
- .subscribe()를 호출하기 전까지는 아무것도 실행되지 않는다.
- 방출하는 이벤트
- onNext: 새로운 데이터가 흘러왔을 때 (여러번 발생 가능)
- onError: 에러가 발생했을 때 (발생 즉시 스트림 종료)
- onCompleted: 스트림이 정상적으로 끝났을 때 (발생 즉시 스트림 종료)
- Observable 생성 방법
- just: 하나의 값을 방출하고 완료
- of: 여러개의 값을 순서대로 방출
- from: 배열의 요소를 하나씩 방출
- create: 직접 이벤트를 제어하며 생성
- interval: 일정 시간마다 값을 방출
- empty/ never/ error: 특수 목적 Observable
- Observable의 생명 주기
2. Cold vs Hot
- Cold Observable: 구독할 때마다 처음부터 시작
- 각 구독자가 독립적으로 스트림을 처음부터 받는다
- 네트워크 요청, 파일 읽기 등이 대표적인 Cold Observable이다
- Observable.create, Observable.just, Observable.from 등이 해당된다.
- Hot Observable
- 구독 이전의 데이터는 받을 수 없다.
- 버튼 탭, 텍스트 입력, 소켓 데이터 등이 대표적인 Hot Observable이다.
- Subject, RxCocoa의 UI 이벤트 등이 해당된다.
3. Observer
- Observer는 Observable이 방출하는 이벤트를 받아서 처리하는 구독자이다.
- Observable 혼자서는 아무 의미가 없다. Observer가 subscribe를 진행해야 데이터가 흐르기 시작한다.
4. Subscribe: 구독
- subscribe는 Observer가 Observable을 구독하는 행위이다.
- onNext, onError, onCompleted 3가지 이벤트를 처리할 클로저를 등록한다.
- 모든 클로저를 다 작성할 필요는 없다. 필요한 것만 골라서 사용할 수 있다.
- bind(to:): UI 바인딩 전용 subscribe
- UI에 데이터를 연결할 때는 subscribe 대신 bind(to:)를 자주 사용한다.
- onNext만 처리한다. (에러, 완료 이벤트 무시)
- UI 바인딩처럼 에러가 발생하면 안되는 상황에 적합하다.
- subscribe보다 코드가 간결하다
5. Disposable: 구독의 반환값
- subscribe를 호출하면 Disposable 객체가 반환된다.
- 이는 구독을 해제할 수 있는 핸들이다.
- 매번 disposable.dispose()를 호출하는 것은 번거로우며 실수하기 쉽다.
- DisposeBag: 메모리 자동 관리
- Disposable을 한데 모아두었다가, DisposeBag이 해제될 때 모든 구독을 한번에 해제하는 도구이다.
- weak self: 메모리 순환 참조 방지
- subscribe 클로저 안에서 self를 사용할 때는 반드시 [weak self]를 사용해야 한다.
- ViewController -> (strong) -> Observable 구독
- Observable 구독 -> (strong) -> ViewController (self 캡쳐)
- 서로를 강하게 참조 -> 메모리 해제 안됨