Observable
- Observable은 Rx의 심장
- Rx에서는 Stream이라는 표현 대신 Sequence라는 표현을 사용
- Observable은 Sequence이다.
- Observable은 일정 기간동안 이벤트를 생성하며, 이를 방출(emit)이라고 한다.
- 이벤트는 숫자 또는 사용자 정의 유형의 인스턴스와 같은 값을 포함하거나 탭과 같은 인식된 제스처를 포함할 수 있습니다.
- Observable이 종료될 때에는 completed 이벤트가 발생
- Observable이 아직 종료되지 않았지만, 어떤 오류로 인해 중단될 경우 error 이벤트가 발생
- completed, error 이벤트 발생 후에는 모두 어떠한 이벤트도 발생하지 않고 Observable이 중단된다.
public enum Event<Element> {
case next(Element)
case error(Swift.Error)
case completed
}
Observable 시퀀스 생성 메서드 정리
-
Observable.just
- just 메서드는 단일 요소만 포함하는 Observable 시퀀스를 생성하기 때문에 이런 이름이 붙여졌다. Observable의 정적 메서드이다. 그러나 Rx에서는 메소드를 "연산자"라고 한다.
-
Observable.of
- of 연산자에는 가변 매개변수가 있고, 이를 바탕으로 제네릭 타입을 추정한다.
- 여러 개의 인자를 넣어 Observable을 생성할 수 있다.
-
Observable.from
- 배열을 인자로 받아 각 배열 요소를 방출하는 Observable 시퀀스를 생성한다.
-
Observable.empty
- 아무런 next이벤트도 방출하지 않고, 바로 completed이벤트를 방출하는 Observable 시퀀스를 생성한다.
-
Observable.never
- 아무것도 방출하지 않고, 절대 종료되지 않는 Observable 시퀀스를 생성한다.
-
Observable.range
- 범위를 지정해서 값을 방출하는 Observable 시퀀스를 생성한다.
-
Observable.create
- observer들에게 내보낼 이벤트를 지정하여 Observable 시퀀스를 생성한다.
- subscribe 라는 단일 매개변수를 사용하며, observer에게 방출할 이벤트를 직접 지정한다.
- subscribe 매개변수는 이스케이프 클로저로, (AnyObserver) → Disposable 타입이다.
- 마지막에 Disposables.create() 로 Disposable을 생성하여 리턴한다.
-
Observable.deffered
-
subscriber가 지정되는 것을 기다리는 Observable을 생성하는 대신, 각 subscribers들에게 새로운 Observable 시퀀스를 제공하는 Observable 팩토리를 만든다.
let disposeBag = DisposeBag()
var flip = false
let factory: Observable<Int> = Observable.deferred {
flip.toggle()
if flip {
return Observable.of(1, 2, 3)
} else {
return Observable.of(4, 5, 6)
}
}
-
외부적으로는 Observable 팩토리와 일반적인 Observable 시퀀스를 구별할 수 없다. 똑같이 subscribe 메서드를 통해 구독하면 된다.
Subscribing
Disposing & Terminating
-
Observable은 Subscribing이 설정될때 까지 아무런 동작도 하지 않는다는 것에 유의하자
-
Subscribing은 Observable을 트리거 하는 동작이다.
-
하지만 subscribing을 취소하여 수동으로 Observable을 종료시킬수도 있다.
-
명시적으로 subscribing을 취소하려면, dispose()를 호출한다.
-
각 subscribing을 개별적으로 관리하여 취소하는 것은 너무 귀찮으므로 RxSwift에는 DisposeBag이라는 타입이 있다. 이것은 일반적으로 각 Disposable 에서 disposed(by:) 메서드를 사용하여, 담길 DisposeBag을 지정하고, 해당 DisposeBag이 메모리에서 할당 해제 될 때, 담겼던 Observable 시퀀스들을 한꺼번에 할당 해제 시킨다.
-
일반적으로 다음의 단계가 자주 쓰인다.
- DisposeBag을 생성한다.
- Observable을 생성한다.
- subscribing으로 Observable을 구독한다.
- subscribing에서 반환된 Disposable을 DisposeBag에 추가한다.
왜 이런 동작을 해줘야 할까?
- disposeBag에 구독을 추가하는 것을 잊거나
- 구독이 끝났을 때 수동으로 dispose를 호출하거나
- 다른 방식으로 관찰 가능 항목이 어느 시점에서 종료되도록 하면 메모리 누수가 발생할 수 있기 때문이다.
Traits
- traits는 일반적인 Observable보다 좁은 행동 집합을 가진 Observable이다.
- 대신 traits를 사용할 수 있는 곳이면 어디든 Observable을 사용할 수 있다.
- 사용의 목적은 코드를 읽는 사람이나, API 호출 부분에서 그 의도를 명확히 밝히기 위해서이다.
- 코드를 직관적으로 만드는데 도움이 된다.
- 3가지 종류가 있다. Single, Maybe, Completable
Single
- success(value) 또는 error(error) 이벤트를 방출한다.
- success는 next와 completed 이벤트의 조합이라고 생각하면 된다.
- 네트워크 API 호출이나 데이터 로드 시 성공 또는 실패를 나타내고 싶을 때 유용하게 사용할 수 있다.
Completable
- completed 또는 error(error) 이벤트 만을 내보낸다.
- 어떤 값도 방출하지 않는다.
- 파일 쓰기와 같은 작업이 완료되었는지, 혹은 실패되었는지에만 관심이 있는 경우에 사용할 수 있다.
Maybe
- Single과 Completable의 합성
- success(value), completed, error(error)를 방출할 수 있다.
- 기본적으로 성공혹은 실패할 수 있는 경우의 작업을 구현하고 만약 성공할 경우 값을 반환해야 하는 경우에 적용할 수 있다.
출처: Raywenderlich RxSwift. Reactive Programming with Swift 도서